gpt4 book ai didi

php - Laravel WhereHas 与多态关系

转载 作者:可可西里 更新时间:2023-11-01 08:17:37 25 4
gpt4 key购买 nike

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

我得到了期望值。

在我的数据库中,一个企业对象没有超过 1 个标签,因此标签要么隐藏,要么不隐藏,因此其中一个条件应该为假。

编辑

这是可标记的表格

+----+----------+--------------+----------------+-----------+
| 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,所以这可能是问题的根源。

最佳答案

虽然我不知道问题是什么,但我敢打赌你实际上得到了正确的答案,而你的期望是不正确的。

你的第二个例子只有一个 whereHas 显然不会返回任何行,因为条件永远无法满足。

但是,首先,我想您的理解是有缺陷的。生成的查询反射(reflect)了您使用两个 whereHas 子句指定的内容。它将找到至少有一个隐藏标签和至少一个未隐藏标签的所有企业。由于这是一个多对多的关系,这实际上是可满足的。

请注意,这与第二个示例不同,在第二个示例中,您搜索至少有一个标签既隐藏又未隐藏的所有企业。

我不知道enterprises表,也不知道many-many join表,但我猜这两个结果实际上满足我上面所说的条件。您的数据库引擎可能不会撒谎。如果您不这么认为并且感觉生成的查询实际上是错误的,请告诉我们您认为错误的地方。

关于php - Laravel WhereHas 与多态关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20744377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com