Laravel Eloquent 关系 findMany 或 find

Posted

技术标签:

【中文标题】Laravel Eloquent 关系 findMany 或 find【英文标题】:Laravel Eloquent Relationships findMany or find 【发布时间】:2017-03-07 05:49:19 【问题描述】:

如果你有两个模型Post和Comment,并且在Comment模型中你定义了一个belongsTo(),关系叫做posts,我知道可以这样做:

App\Comment::find(1)->posts()->where('category', 3)->get()

但我想要的是将多个主键 id 传递给 find 方法,例如:

App\Comment::find([1,2,3])->posts()->where('category', 3)->get()

或者

App\Comment::findMany([1,2,3])->posts()->where('category', 3)->get()

这两个给了我错误method posts does not exist。那么我还能如何处理这个问题呢?

【问题讨论】:

我终于从@Lukasgeiter找到了最好的方法,他在查询中使用了with和whereHas的组合。 我使用的查询比我的示例更复杂,您的答案在单独使用时对我不起作用,因此我决定结合使用 with 和 whereHas。不过,您的回答对我有所帮助。 【参考方案1】:

当您使用find() 方法时,您会得到一个模型,但findMany() 返回一个集合。

你可能想要的是这个:

App\Comment::whereIn('id', [1, 2, 3])->with(['posts' => function($q) 
    $q->where('category', 3);
])->get();

【讨论】:

非常感谢,最好使用$q->where('posts.category', 3);,因为两个表可以有相同的列【参考方案2】:

这对我有用@Lukasgeiter 他在查询中使用了 with 和 whereHas 的组合。

【讨论】:

【参考方案3】:

为此,您必须使用回调方法,如下所示

App\Comment::whereIn('id', [1, 2, 3])->with(['posts' => function($query) 
     $query->whereCategory(3);
])->get();

【讨论】:

你不应该复制粘贴别人的答案。您复制了 $q 而不是 $query (在原始文档中到处都是),并且您从原始答案 )->get() 而不是 ])->get() 复制了我的错误,我在发布原始答案后一分钟内修复了该错误. @AlexeyMezenin 有点可疑。

以上是关于Laravel Eloquent 关系 findMany 或 find的主要内容,如果未能解决你的问题,请参考以下文章

深入理解 Laravel Eloquent——模型间关系(关联)

laravel 返回与 eloquent 和 laravel 的关系

在最近的关系记录中搜索 - Laravel (Eloquent)

Laravel / Eloquent 模型关系查看器

Laravel 按 Eloquent 关系分组

laravel eloquent 中的一对多关系