2015-04-28 6 views
2

У меня есть две модели:Изменить необработанный запрос присоединиться к Laravel красноречивый

$modelMain = "SearchPages"; //table_name : search_pages 
$modelSites = "Site"; // table_name : sites 

Я изначально был ниже запрос для получения количества только из одной модели $modelMain:

$records = $modelMain:: 
     select(DB::raw("COUNT(DISTINCT {$columnRecordedOn}) as records_count")) 
     ->groupBy($columnRecordedOn, $columnSiteId) 
     ->get(); 

Теперь мне нужно присоединиться его со 2-й моделью $modelSites имя таблицы whoese - sites, чтобы проверить колонку состояния в sites, если ее 1.

I модифицировал запрос:

$records = $modelMain:: 
    select(DB::raw("COUNT(DISTINCT {$columnRecordedOn}) as records_count")) 
    ->join('sites','search_pages.site_id','=','sites.site_id') //added this 
    ->where('sites.status','=','1') // and this 
    ->groupBy($columnRecordedOn, $columnSiteId) 
    ->get(); 

Все работает нормально, но как вы можете видеть, я использую имя таблицы sites непосредственно в join() и в where() вместо этого я должен использовать название модели я считаю.

Как я могу преобразовать этот запрос в правильный Laravel Eloquent?

Спасибо за любую помощь.

ответ

1

в принципе вы можете использовать «с» методом, чтобы получить родственную модель

сайт Модель

class Site extends Eloquent { 

    public function searchpages() 
    { 
    return $this->hasMany('SearchPage','site_id','site_id'); 
    } 

} 

SearchPage Модель

class SearchPage extends Eloquent { 

    public function site() 
    { 
    return $this->belongTo('Site','site_id','site_id'); 
    } 

} 

$ записей = SearchPage :: с ('сайт') -> получить();

согласно вашей потребности

$records = SearchPage:: 
     select(DB::raw("COUNT(DISTINCT {$columnRecordedOn}) as records_count")) 
    ->whereHas('site' => function($q){ 
             $q->where('status','1'); 
            }) 
    ->groupBy($columnRecordedOn, $columnSiteId) 
    ->get(); 
+0

Спасибо @ Kamlesh.bar, но его не фильтруются в соответствии со статусом, однако это дает какую-либо ошибку. – Fahad

+0

@Fahad Я поставил неправильные имена «сайты», вместо этого он должен быть «сайтом» в соответствии с именем функции в SearchPage Model. отредактировал ответ –

+0

Я исправил это ... он все еще возвращает все записи. – Fahad

2

Вы смотрели, используя отношения в красноречивых, вы должны объявить отношения в ваших двух моделей, что-то вроде:

class SearchPages extends Eloquent { 

    public function sites() 
    { 
    return $this->hasMany('sites'); 
    } 

} 

Более подробную информацию о красноречивых и отношения посмотреть на этой ссылке: http://laravel.com/docs/4.2/eloquent#relationships

Смежные вопросы