如何在 laravel 5.4 orm 中执行多个 has() /orHas()

Posted

技术标签:

【中文标题】如何在 laravel 5.4 orm 中执行多个 has() /orHas()【英文标题】:how can do a multiple has() /orHas() in laravel 5.4 orm 【发布时间】:2017-08-26 06:17:13 【问题描述】:

首先我应该说我想使用 laravel ORM 而不是查询构建器而不是原始 sql 方法。所以这是我的问题。

我有一个名为 bots 的模型,它具有 belongTo(User::class) 关系和 6 个 hasMany(TextPost::class) - hasMany(PhotoPost::class) 等等。我想获得在任何hasMany(...) 关系中至少有一条记录的机器人。因此,如果机器人在 TextPost 中有记录,则应将其退回,如果机器人在任何 hasMany(...) 关系中都没有帖子,则不应退回。

到目前为止,我的 User 模型中有类似的东西

    public function broadCasters()
    
        return $this->bots->has('text_post')->orHas('photo_post')->orHas('media_post')->orHas('video_post')->orHas('audio_post')->orHas('document_post');
    

但它不起作用并说Call to a member function orHas() on boolean

所以我想把它改成这样:

public function broadCasters()
  return $this->bots->where(function($query)
    return $query->has('TextPost')->orHas('PhotoPost') ...;
  );

但这也行不通,并说Missing argument 2 for Illuminate\Support\Collection::where()。我该怎么办?

我使用 laravel 5.4。但是我看到了这个问题whereHas on multiple relationships - laravel 5.4,它非常接近我想要的,但还没有答案!!

这个问题也是我的另一个问题,Combining AND/OR eloquent query in Laravel

但它也不起作用。

现在这正是我想要但不起作用的,我认为因为它适用于 LARAVEL 4 并且我使用 LARAVEL 5.4

Laravel eloquent multiple has and where clause

【问题讨论】:

$reqObj->where(function($q)$q->has('group');$q->orHas('group_member'););对我来说似乎工作正常。 【参考方案1】:

在此处输入代码如果您使用$this->bots,则结果将是 laravel 集合数组。你需要像这样使用$this->bots()

public function broadCasters()
  return $this->bots()->where(function($query)
    return $query->has('TextPost')->orHas('PhotoPost') ...;
  )->get();

【讨论】:

以上是关于如何在 laravel 5.4 orm 中执行多个 has() /orHas()的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5.4 中向多个抄送收件人发送电子邮件

如何在 Laravel 中为 ORM 急切加载添加多个键约束?

如何在 Laravel 雄辩关系中添加多个条件

Laravel 5.4 - 如何为同一个自定义验证规则使用多个错误消息

如何在 Laravel Eloquent ORM 中获取插入的多行数据

如何在 Eloquent ORM laravel 中获取最后一个插入 ID