【问题标题】:When to use Eloquent (ORM) over Fluent (Query Builder)? [closed]何时使用 Eloquent (ORM) 而不是 Fluent (Query Builder)? [关闭]
【发布时间】:2013-07-19 07:01:43
【问题描述】:

也许由于我的 Codeigniter 背景,我发现自己并不喜欢 Laravel 4 的 Eloquent ORM。假设我想编写一个查询,按 id 降序排列帖子列表,Eloquent 怎么能打败DB::table('posts')->orderBy('id', 'desc')->get(); 的清晰度?

是否有充分的理由使用 Eloquent 而不是 Fluent,主要用于连接表?

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案1】:

    我也来自 codeigniter,这是我的经验: 我通常同时使用 Eloquent 和 Fluent。 Eloquent 是一个可以让你很好地处理关系、CRUD 操作等的东西。当你需要做一些 SQL 操作时,你可以很容易地添加一些流畅的函数

    在您上面提到的示例中,我看到您有帖子表。如果你有一个帖子模型,那么使用 Eloquent 编写的相同内容是:

    Post::orderBy('id', 'desc')->get();
    

    所以如果你扩展 Eloquent 而不是

    Model_name::some_functions
    

    一样
    DB::table('table_name')->some_functions
    

    真正的力量来自于您需要创建或更新模型,或者,例如,获取 post cmets。比它变得容易:

    $comments = Post::find($id)->comments;
    

    所以答案是 - 你必须使用流利的函数来获得有序列表。您可以将它们与 DB::table('posts')->orderBy 或 Post::orderBy 一起使用

    【讨论】:

    • 谢谢,只是为了确认,对于Post::find($id)->comments;comments 方法,它是否必须针对Post 表运行,或者它可以是PostComment 表之间的连接?
    • 不确定我是否理解。你有 post 和 cmets 表,你在 cmets 表中有 post_id,你在 post 类中描述了一个方法(function cmets() { return $this->hasMany('comment'); }。你也有 Comment 类。然后您可以使用 Post::find($id)->cmets 将您的帖子与 cmets 一起加入(例如 selet * from posts join cmets on cmets.post_id = posts.id)
    • 澄清一下,Eloquent 继承自 Fluent,所以基本上你在 Fluent 中拥有的所有东西都可以在 Eloquent 中使用。如果您正在执行Post::find($id)->comments,则默认情况下您不会执行join,而是首先执行SELECT * FROM posts WHERE id=$id,然后执行SELECT * FROM comments WHERE post_id=$id,但仅在您调用/请求->comments 时才执行。如果您想同时加载所有关系,请查看Eloquent's Eager Loading
    • 对不起,我可能问了一个愚蠢的问题。如果我们已经知道 post_id,为什么 Eloquent 必须生成 2 个请求才能获取 cmets?据我了解,在 post_id 中传递的一个查询(直接来自 cmets 表)是否就足够了?听起来确实效率低下。任何意见,将不胜感激。谢谢!
    • @Tomas Cheng 你总是可以告诉 Laravel 通过在读取模型时手动指定连接来提高查询效率,结合with - Laravel 足够聪明,可以检测到相关对象是通过指定连接,然后它不会创建额外的 SQL 查询。
    【解决方案2】:

    使用模型和 Eloquent,您还可以在模型类中编写自定义函数来执行常见操作,例如输出几个串联字段。

    例如:

    <?php
    class User extends Eloquent {
        //Standard Relation Function
        public function posts() {
            return $this->hasMany('Post');
        }
        //Custom function
        public function fullname() {
            return $this->firstName.' '.$this->lastName;
        }
    }
    
    //Somewhere else in your code, if you need a users full name...
    $user = User::find(3);
    $name = $user->fullname();
    

    【讨论】:

    • 我们也可以通过 getXAttribute() 函数进一步实现这一点。例如:getFullNameAttribute() 然后我们可以做 $user->fullName.
    • @euantorano 确实,好点子!
    猜你喜欢
    • 2016-12-21
    • 2017-04-23
    • 2018-08-12
    • 2023-03-29
    • 2019-08-02
    • 1970-01-01
    • 2017-12-07
    • 2016-05-26
    • 2013-05-27
    相关资源
    最近更新 更多