2015-07-21 2 views
5

Я хотел бы получить все модели, у которых нет отношений.Получить все красноречивые модели без связи

Подобно выборки моделей, которые имеют одно:

return $this->model->has('quote')->orderBy('created_at', 'desc')->get(); 

Я в основном хотел бы иметь обратное этому. Однако я не могу найти документацию, чтобы сделать это.

В основном этот запрос:

SELECT * FROM custom_design_requests 
RIGHT JOIN quotes 
ON quotes.`custom_design_request_id` = `custom_design_requests`.id 

Но я хотел бы, чтобы избежать необходимости использовать Query Builder (DB::table('custom_design_requests')->rightJoin('quotes', 'quotes.custom_design_request_id', '=', 'custom_design_requests.id')->get();), так что у меня есть коллекция экземпляров модели.

Благодаря

ответ

9

Вы можете попробовать что-то вроде этого:

$this->model->has('quote', '<', 1)->orderBy('created_at', 'desc')->get(); 
+1

Спасибо! То, что сделал трюк, должно иметь хотя бы из этого. :) –

+0

Хотя метод has() кажется очень простым в использовании, вы должны иметь в виду, что Eloquent делает внутренне, когда вы его вызываете. В результате запроса будет выполняться подзапрос для каждой записи, имеющейся в вашей базе данных, которая может быть неэффективной, если у вас много данных. В вышеприведенном случае результат SQL будет выглядеть примерно так: SELECT * FROM models WHERE (SELECT COUNT (*) FROM quotes WHERE model_id = models.id) <1 " –

1

Try:

return $this->model 
    ->leftJoin('quotes', 'quotes.custom_design_request_id', '=', 'custom_design_requests.id') 
    ->whereNull('quotes.custom_design_request_id') 
    ->orderBy('created_at', 'desc')->get(); 

Это LEFT JOIN модель с цитатами и принимать только те, для которых нет соответствующих цитат.

+1

Спасибо, это работает. Я предпочитаю метод 'has ('quote', '<', 1)'. :) –

+1

Прохладный, я не знал, что вы можете это сделать, я думаю, я тоже узнал о нём сегодня :) –

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