【发布时间】:2019-05-18 16:11:14
【问题描述】:
我正在使用 Eloquent 从由三个表组成的查询中生成结果:
photos (id)
photos_to_photosets (photo_id, photoset_id)
photosets (id)
我的模型将它们的多对多关系定义为:
class Photo extends Model
{
public function photosets()
{
return $this->hasMany(PhotoSet::class, 'photos_to_photo_sets');
}
}
和
class PhotoSets extends Model
{
public function photos()
{
return $this->belongsToMany(Photo::class, 'photos_to_photo_sets');
}
}
现在,为了获取结果,我不得不使用以下 Eloquent 代码:
$photoData = $this->photoSets->photos()
->orWhere('photo_set_id', '=', $id)
->get();
这会产生以下查询:
SELECT * FROM `photos`
INNER JOIN `photos_to_photo_sets`
ON `photos`.`id` = `photos_to_photo_sets`.`photo_id`
WHERE `photos_to_photo_sets`.`photo_set_id` is null
OR `photo_set_id` = ?
此查询有效,但我似乎无法从查询中删除 WHERE `photos_to_photo_sets`.`photo_set_id` is null。
我尝试只使用->where('photo_set_id', '=', $id),但 null 子句仍然存在;更糟糕的是,它会产生以下 WHERE 子句:
... WHERE `photos_to_photo_sets`.`photo_set_id` IS NULL
AND `photo_set_id` = ?
有什么方法可以利用 Eloquent 删除这个空的 WHERE 子句段吗?
理想情况下,我希望得到以下查询:
SELECT * FROM `photos`
INNER JOIN `photos_to_photo_sets`
ON `photos`.`id` = `photos_to_photo_sets`.`photo_id`
WHERE `photo_set_id` = ?
提前感谢您的帮助!
更新
根据@Jonas Staudenmeir 的回答,空的 WHERE 子句已被删除。
为了实现这一点,我在运行查询之前设置了 photoSet 的模型 ID。结果代码是:
$this->photoSets->id = $photoset_id;
$photoData = $this->photoSets->photos()->get();
生产者:
SELECT * FROM `photos`
INNER JOIN `photos_to_photo_sets`
ON `photos`.`id` = `photos_to_photo_sets`.`photo_id`
WHERE `photo_set_id` = ?
【问题讨论】:
-
什么是
$this->photoSets? -
@Jonas Staudenmeir 抱歉,我没有将控制器粘贴到执行查询的位置。在控制器中,我为我的 PhotoSet 模型使用依赖注入。
-
看起来注入的模型是空的或者没有
id。dd($this->photoSets->getAttributes());的结果是什么? -
@Jonas Staudenmeir 运行返回一个空的结果集。我很困惑,你是什么意思:“注入的模型是空的或没有id”?
-
@Jonas Staudenmeir 你是我们的目标!在运行查询之前,我必须将
$this->photoSet->id =的 id 设置为实际值。不过,我不必添加protected $attributes = ['id'= x]。谢谢!如果您发布它,我可以接受它作为答案。
标签: eloquent many-to-many pivot-table where-clause laravel-5.7