سلام برای بدست آوردن مکانهای نزدیک در حد ترافیک کم اگه سایتت تون داره از این کد استفاده کنید ولی برای ترافیک زیاد توصیه نمیکنم چون توان پردازشی بالا میخواد برای اون سیستمها دیگه وجود داره که استفاده کنید ولی اگه خودتون میخواد کد php بزنید این جواب میده تست شده .
public function getByNearFilterAcvJoin($table1,$table2,$connect,$l imit,$offset,$order_to,$order,$needs,$where=null,$ condition,$lat,$long,$km_per_degree ,$distance,Silex\Application $app)
{
$sql = "SELECT $needs "; $sql .=",".$km_per_degree." * ACOS( COS( RADIANS( ".$lat." ) ) * COS( RADIANS( ".$table1."._lat ) ) * COS( RADIANS( ".$table1."._long ) - RADIANS( ".$long." ) ) + SIN( RADIANS( ".$lat." ) ) * SIN( RADIANS( ".$table1."._lat ) ) ) AS distance ";
$sql .= "FROM $table1 INNER JOIN $table2 ON $table1.$connect = $table2.$connect ";
$sql .= "WHERE ";
$sql .= "active=1";
if(isset($where))
{ $sql .= " AND ( ";
$c = count($where);
$i = 0;
foreach ($where as $key => $value)
{
if(is_numeric($value))
$sql.=$key." = :".$key;
else
$sql.=$key." LIKE CONCAT('%',:".$key.",'%')";
$i++;
if($c!=$i) $sql.=" ".$condition." ";
}
$sql.=" )";
}
$sql .= " HAVING (distance < ".$distance.")";
$sql .=" ORDER BY $order $order_to ";
if($limit>0)
$sql .= "LIMIT $limit OFFSET $offset";
if(isset($where))
$row = $app['db']->fetchAll($sql , $where);
else
$row = $app['db']->fetchAll($sql);
return $row;
}
درخواست نمونه
$this->entities = $this->store->near($request->get('limit',10),$request->get('offset',0),$request->get('order_to','DESC'),$request->get('order','distance'),'store_id,store_name,gnam e,state,city,logo,header_image,we_score,users_scor e,visit,_lat,_long',$where,$request->get('condition','OR'),$request->get('_lat'),$request->get('_long'),$request->get('km_per_degree',3959) ,$request->get('distance',0.310685596), $app);
$items = $this->db->getByNearFilterAcvJoin($this->table_name,'groups','group_id',$limit,$offset,$or der_to,$order,$needs,$where,$condition,$lat,$long, $km_per_degree ,$distance ,$app);
ببخشید فقط یه خورده شلوغه چون برای یه پروژه قدیمی silex بود اصلش همون query که زدم