кажется, что метод whereHas работает не очень хорошо.Laravel WhereHas с полиморфными отношениями
$res = Entreprise::whereHas('labels',function ($q)
{
$q->where('hidden','!=',1);
})
->whereHas('labels',function ($q)
{
$q->whereHidden(1);
})
->get();
dd(count($res)); //shows int 2
Вот лейблы отношения:
public function labels()
{
return $this->morphToMany('Label', 'labelable');
}
и здесь база данных:
id | nom | deleted_at | created_at | updated_at | junior_id | label_type_id | abbreviation | id_siaje | hidden
6 | Environnord | 0000-00-00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 1 | 4 | EnvNord | 0 | 1
7 | Salon créer | 0000-00-00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 1 | 4 | Créer | 0 | 1
8 | Salon WebAnalytics | 0000-00-00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 1 | 4 | Web | 0 | 0
Когда я вместо этого:
$res = Entreprise::whereHas('labels',function ($q)
{
$q->where('hidden','!=',1);
$q->whereHidden(1);
})->get()
dd(count($res)); //int 0
Я получаю ожидаемое значение ,
В моей базе данных объект entreprise не содержит более 1 метки, поэтому ярлык скрыт или нет, поэтому одно из условий должно быть ложным.
Редактировать
Вот labelable таблица
+----+----------+--------------+----------------+-----------+
| id | label_id | labelable_id | labelable_type | junior_id |
+----+----------+--------------+----------------+-----------+
| 1 | 1 | 925 | Etude | 1 |
| 2 | 2 | 926 | Etude | 1 |
| 3 | 3 | 927 | Etude | 1 |
| 4 | 2 | 927 | Etude | 1 |
| 5 | 1 | 928 | Etude | 1 |
| 6 | 2 | 928 | Etude | 1 |
| 7 | 3 | 929 | Etude | 1 |
| 8 | 2 | 931 | Etude | 1 |
| 9 | 1 | 933 | Etude | 1 |
| 10 | 2 | 934 | Etude | 1 |
| 11 | 4 | 1 | User | 1 |
| 12 | 5 | 2 | User | 1 |
| 13 | 7 | 1 | Entreprise | 1 |
| 14 | 6 | 2 | Entreprise | 1 |
| 15 | 7 | 3 | Entreprise | 1 |
| 16 | 8 | 4 | Entreprise | 1 |
| 17 | 6 | 5 | Entreprise | 1 |
| 18 | 7 | 6 | Entreprise | 1 |
| 19 | 6 | 7 | Entreprise | 1 |
+----+----------+--------------+----------------+-----------+
Как вы можете видеть, проблема, вероятно, что они являются два лица с labelable_id 1, и два объекта из labelable_id 2. Но это morphToMany, поэтому Eloquent должен знать, что метки на пользователях не следует принимать во внимание?
Когда я взглянуть на сгенерированный SQL:
select * from `entreprises`
where `entreprises`.`deleted_at` is null
and `entreprises`.`junior_id` = ?
and (select count(*) from `labels`
inner join `labelables` on `labels`.`id` = `labelables`.`label_id`
where `labels`.`deleted_at` is null
and `labels`.`junior_id` = ?
and `labelables`.`labelable_id` = `entreprises`.`id`
and `hidden` != ?
and `hidden` = ?
and `labels`.`deleted_at` is null
and `labels`.`junior_id` = ?) >= ?
кажется, что labelables.labelable_type
не принимается во внимание, так что может быть источником проблемы.
Что вы хотите сказать? –
- это «return $ this-> morphToMany ('Label', 'labelable')/* -> select (" опечатка в вопросе или это реальный код? – marcanuy
Эй, мой вопрос в том, что, учитывая, что у компаний есть только один label в моей базе данных, я не понимаю, почему первый синтаксис показывает результаты, а второй - нет. @marcanuy: это была просто опечатка, я отредактировал код. – edi9999