2015-07-17 5 views
3

Я пытаюсь совместить некоторые методы в «Красноречии», но, похоже, не получается собрать их правильно. У меня есть запрос, который тянет все элементы, где счет hasMany равен 0.Комбинация Laravel имеет() и whereHas()

Так что в основном я хочу знать, где отношения «пусты». В этом случае у меня есть элемент со звуковыми образцами. Итак, я хочу получить предметы, в которых пока нет звуковых образцов.

return $this->hasMany('App\Models\Item')->has('audios', '=', 0); 

Это работает полностью нормально. Однако я также хочу добавить фильтр, основанный на мужских и женских образцах аудио. Если я использую whereHas, я могу получить фильтр, но только напрямую и не могу получить предложение has 0.

return $this->hasMany('App\Models\Item')->whereHas('audios', function ($q) { 
    $q->where('gender', 'female'); 
}); 

Но нет, я хочу объединить их и не могу понять этот бит. Итак, «получите все предметы без женских аудио-образцов».

Не много документации по этим вопросам, кроме как в тривиальном случае, я пробовал несколько вариантов, но это не подходит. Просто полностью пустые наборы или только самка или мужчина непосредственно без этого «пустого» набора 0.

Вот запрос, я хотел бы получить:

SELECT * 
FROM `items` 
WHERE (
    SELECT COUNT(*) 
    FROM `audios` 
    WHERE `audios`.`item_id` = `items`.`id` 
    AND `audios`.`gender`='female' 
) = 0 
+0

Не уверен, что если вы предназначенные для того, чтобы получить самок И пустых женщин или пустых женщин $ q-> где («пол», «женщина») -> или где («аудио», «=», «0») или '$ q-> где ('gender ',' female ') -> где (' audios ',' = ', 0); ' –

+0

@Peh' audios' - это имя отношения. поэтому 'item-> hasMany ('audios')'. Мне нужны все предметы, где «нет женских аудио». Я обновил сообщение, чтобы включить прямой запрос, который я ищу. – Rob

+0

не смог проверить его, но вы можете попробовать это? 'Return $ this-> hasMany ('App \ Models \ Item') -> has ('audios' , '=', 0) -> где ('gender', 'female'); ' –

ответ

3

whereHas, doesntHave и т.д., все методы, которые, в конце концов, называют has. Если вы посмотрите на подпись whereHas вы можете увидеть, что она позволяет подсчетом быть переданы, а также:

public function whereHas($relation, Closure $callback, $operator = '>=', $count = 1) 

Таким образом, вы могли бы сделать это, или просто использовать whereDoesntHave:

return $this->hasMany('App\Models\Item')->whereDoesntHave('audios', function ($q) { 
    $q->where('gender', 'female'); 
}); 
+0

thx @lukasgeiter – Rob

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