【问题标题】:Laravel Eloquent ORM - Nested with statementsLaravel Eloquent ORM - 嵌套语句
【发布时间】:2016-10-12 20:14:10
【问题描述】:

所以我正在为我正在创建的 Web 应用程序创建一个 API,并试图将其保留在 Eloquent ORM 中。我有一个亲子关系:

用户 -> 站点日志 -> 站点

站点类代码:

class Site extends Model {
    public function log() {
        return $this->hasMany('App\SiteLog', 'site_id', 'id');
    }
}

SiteLog 类代码:

class SiteLog extends Model
{       
    public function site()
    {
        return $this->belongsTo('App\Site', 'site_id', 'id');
    }

    public function user()
    {
        return $this->belongsTo('App\User', 'user_id', 'id');
    }
}

当我使用以下方法实例化 SiteLog 类时:

$sites = Site::with('log')->get();

当我使用 jQuery 发出 GET 请求时,我获得了所有站点,并且在其中我有一个对象数组,其中包含站点相应日志的所有数据。这正是我想要的。但是,我想更进一步,获取与日志关联的用户。

有点像这是如何工作的:

SiteLog::with('user')->get();

但全部在一个语句中,就好像它是一个大的连接查询。但是,我不确定 Eloquent ORM 是否涵盖了这样的测试用例。

有人做过这样的事情吗?我可以通过一些非常 hacky 的做法或仅编写原始 SQL 查询来完成此操作,但我只是想知道是否有更雄辩的方式来执行此操作。

【问题讨论】:

    标签: php laravel join orm eloquent


    【解决方案1】:

    类似:

    Site::with('log.user')->get();
    

    Laravel 5.2 Docs - Eloquent - Relationships - Eager Loading - Nested Eager Loading

    你最终会得到一个类似的结构:

    Site
        log: [
            SiteLog
                User
            SiteLog
                User
            ...
        ]
    

    【讨论】:

    • 如何从嵌套链中获取最后一个对象User
    【解决方案2】:

    Eloquent 让您轻松做到这一点:)

    https://laravel.com/docs/5.2/eloquent-relationships#eager-loading

    如果您还需要与每个日志相关的用户,您只需像这样急切地加载它

    $sites = Site::with('log.user')->get();

    【讨论】:

      猜你喜欢
      • 2019-03-15
      • 2012-12-10
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 2015-06-27
      • 1970-01-01
      相关资源
      最近更新 更多