【问题标题】:Laravel Eloquent Many-To-Many Query Producing Extra null WHERE clauseLaravel Eloquent 多对多查询产生额外的空 WHERE 子句
【发布时间】: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 模型使用依赖注入。
  • 看起来注入的模型是空的或者没有iddd($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


【解决方案1】:

注入的模型没有id

$this->photoSet->id = $id;

那么你就不需要额外的约束了:

$photoData = $this->photoSets->photos;

【讨论】:

    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2017-07-30
    • 2023-03-08
    相关资源
    最近更新 更多