【问题标题】:Return model with custom query in Laravel在 Laravel 中使用自定义查询返回模型
【发布时间】:2017-10-25 03:57:38
【问题描述】:

我已经在我的 eloquent 模型中定义了自定义查询,我想知道当我获得模型时包含其结果的最佳方式是什么。

我知道有受保护的 $with,但它只接受关系然后有 $appends 但那是针对属性的,我的查询返回整个对象,我不知道将它作为属性包含是否是个好主意。

另外,如果有办法在模型方法中做到这一点,我想听听,因为我不一定需要在每个模型实例上都有这些信息。

期待听到您的建议。

编辑: 我熟悉 $with 和关系。 我要问的是如何让这样的东西急切加载:

public function thisIsMyQuery()
{
    return DB::table('example')->where('const', '>', 3);
}

【问题讨论】:

    标签: laravel eloquent laravel-eloquent


    【解决方案1】:

    如果我正确理解了您的需求,您只想急切加载关系。为此,您必须在模型中定义一个关系,并在 $with 数组中添加方法的名称。

    示例:

    // Inside your model class
    
    class Post extends Model
    {
        protected $with = ['comments'];
    
        public function comments()
        {
            return $this->hasMany(Comment::class);
        }
    }
    
    // Usage
    
    $post = Post::find(1)
    $post->comments; // here are the related comments  
    

    【讨论】:

    • 不,我想急切加载我创建的自定义数据库查询。所以它不是一个关系,因为它不是一个关系,所以我不能使用 $with。
    • 为什么要预先加载自定义查询而不是在之后运行它?
    • 嗯,不同之处不仅在于关系,还在于查询的蓝图。我要问的是是否可以做到。如果查询可以返回与关系相同的数据,为什么它不能急切加载是我的问题?如果我没记错的话,预加载比在页面上有很多查询要好。
    • 急切加载à关系就像制作联合非纯SQL。您在同一个查询中聚合数据。但是,如果没有共同的数据,就不可能连接两个表。急切加载关系也是如此。
    • 另一件事,一个大请求并不总是比两个中等请求快。在大多数情况下,只要您不在循环内请求数据库,您就不必担心太多。拥有不太复杂的请求可以让您拥有更多可维护和可读的代码,并从数据库缓存系统中获利
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2016-05-29
    • 2018-09-16
    • 2021-07-04
    • 2016-11-06
    • 2018-01-05
    • 2014-01-23
    相关资源
    最近更新 更多