我将扩展 Sebastian 的答案。
我也有多对多的关系,甚至是一对多的关系。
我实际上已经将 Eloquent 的编程风格(看起来更容易)与 Fluent 的一些联合 hack 融合在一起。请注意,Eloquent 是 Fluent 的扩展,因此除非您正在执行 bat 查询,否则您不会牺牲。
如果您使用一对一或一对多的 User 和 Phone 模型(一个用户可以有多个电话号码)
你只需 where()->get() 然后 $users->phone - 这将使 eloquent 为每个 ID 运行一个 select *。这是使用 Eager Loading(Sebastian 引用但太短而无法实际解释)的地方,它预取所需的所有 ID 并急切加载 ID(您可以通过运行查询日志分析器来验证这一点)。
这样做的额外好处是您可以像这样预先加载许多关系。
因此,如果您没有正确使用它,那么“Eloquent 是否会带来性能影响”的解决方案并不是干巴巴的。
下面是我如何使用 eloquent 和 fluent 的一个小例子:
在 Book Model 中 - 我定义了一个 Scope 函数,它是一个关系函数:
public function scopeLicensorStatus($query, $licensor_status)
{
$query->select('book.*')
->leftJoin('licensors as l', 'l.id', '=', 'book.licensor_id')
->where('l.status','=',$licensor_status);
}
$bookData = Book::
->LicensorStatus('active')
->where('book.status','=', 'active')
->whereIN('book.id',$recommendedIds)
->take($limit)
->skip($offset)
->get();
这样做的作用是为我做一个函数加入,让我从外部链接命令。最后(如果您使用 toSQL() 而不是 get()),您将获得与原始 SQL 匹配的单个查询,但是如您所见 a)如果您打算将连接与其他约束重用,则代码是可重用的, b) 你不会牺牲速度,因为最终游戏查询是一个单一的(只需要正确编写即可),c) 看起来更好且可读,这就是我们喜欢 eloquent 的原因。
希望这个答案能帮助你更深入地了解雄辩