Laravel Eloquent 多对多查询产生额外的 null WHERE 子句
Laravel Eloquent Many-To-Many Query Producing Extra null WHERE clause
我正在使用 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` = ?
注入的模型没有 id
:
$this->photoSet->id = $id;
那么你不需要额外的约束:
$photoData = $this->photoSets->photos;
我正在使用 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` = ?
注入的模型没有 id
:
$this->photoSet->id = $id;
那么你不需要额外的约束:
$photoData = $this->photoSets->photos;