2015-02-11 3 views
1

Как сделать этот запрос в Laravel? Кажется, я попал в путаницу.Laravel Subquery

select * from `entries` 
where (`id` = (
    select entry_id FROM `elements` where `content` = 'David' 
)); 

У меня есть модель ввода и модель Element, и жадная загрузка работает отлично (то есть, если я вместо этого сделал $entries = Entry::with('elements'); он прекрасно работает).

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

Моя попытка захватывает все записи, но только те элементы, где запрос припадки:

$entries = Entry::with(['elements' => function($q) use ($find){ 
    $q->where('content', '=', $find); 
}])->get(); 

ответ

2

Для фильтрации по реляционным моделям, которые вы можете использовать has(). И в этом случае, потому что у вас есть условие для применения, whereHas:

$entries = Entry::with(['elements' => function($q) use ($find){ 
    $q->where('content', '=', $find); 
}]) 
->whereHas('elements', function($q) use ($find){ 
    $q->where('content', '=', $find); 
})->get(); 

Это теперь только нетерпеливые загружает связанную с ними модель, соответствующей предикат, а также гарантирует, что только те записи, которые имеют по крайней мере одну родственную модель возвращаются.

Чтобы уменьшить код дубликата вы также можете поместить замыкание в переменной:

$filter = function($q) use ($find){ 
    $q->where('content', '=', $find); 
}; 

$entries = Entry::with(['elements' => $filter])->whereHas('elements', $filter)->get();