【发布时间】:2018-05-17 03:20:29
【问题描述】:
如果我有这个模型
class Post extends Model{
public function author()
{
return $this->belongsTo(Author ::class);
}
public function category()
{
return $this->belongsTo(Category ::class);
}
}
class Author extends Model{
}
class Category extends Model{
}
并运行它
$posts = Post::with('author', 'category')->get()
laravel 运行 3 个 MySQL 查询。对我来说,速度和性能在这里并不是真正的问题(尽管可能是某人),问题是如果我想按作者姓名或类别名称对帖子进行排序,我无论如何都需要手动加入帖子和类别,这是很尴尬。
1.第一个问题是我需要担心select
->select('posts.*')
例如可以从类别中选择 id 并将其水合到 Post 模型中。
2.第二个问题是我需要担心 groupBy ->groupBy('posts.id'); 例如如果关系是 hasOne 并且帖子有多个类别,则查询将返回更多的类别行。
3.第三个问题是我需要从
更改所有其他地方->where('date', $date)
到
->where('posts.date', $date)
因为帖子和类别可以有日期属性而不会抛出“歧义列”错误。
我认为使用 eloquent 运行连接可能非常尴尬且容易出错。有没有人使用过其他框架 ORM(不一定是 PHP),它们使用 join 进行预加载和 join 对相关表进行排序?
PS。为了过滤相关表,我不需要使用 join,但是 whereHas 会产生通常比连接慢的子查询。
【问题讨论】:
-
您的问题没有准确描述 Eloquent 不使用连接的原因吗?
-
@Devon 是的,当然,你是对的,但我问的是其他 ORM 是否使用连接(这意味着 laravel eloquent 设计不佳)或者 ORM 不使用连接是常见的做法。 ..
-
我不会说 Eloquent 的设计很糟糕,它完成了它打算做的所有事情,并且连接会产生你概述的问题。 Eloquent 没有开箱即用的一件事是按关系排序,但你可以自己做。当我今天晚些时候有机会时,我将添加一个更详细的答案,说明您如何在没有加入的情况下执行此操作。
-
@Devon 我知道如何通过与连接的关系进行排序(这不是问题,有很多 StackOverflow 回答如何做到这一点),我的问题是是否可以更好地设计 eloquent,因为使用连接有口才真的很别扭……
标签: laravel laravel-5.2 laravel-5.5