【问题标题】:Eager load related models in Laravel's Revisionable historyLaravel 的 Revisionable 历史中与 Eager load 相关的模型
【发布时间】:2018-03-08 03:32:25
【问题描述】:

使用 Laravel 5.4 和 VentureCraft/revisionable 包。

我有 3 个模型:UserCompanyOrder

Order 模型实现了 Revisionable 特征:

namespace App\Models;

class Order extends Eloquent {
    use \Venturecraft\Revisionable\RevisionableTrait;

    // ...
}

User 模型与Company 模型有关系:

public function company() {
    return $this->belongsTo('App\Models\Company');
}

我想从订单修订中急切地加载用户的公司。像这样的

$order = Order::with('revisionHistory.user.company')->find(1);

foreach($order->revisionHistory as $revision) {
    $company = $revision->user->company;
}

我尝试从 Revisionable 特征覆盖各种方法(例如 revisionHistoryidentifiableName),但没有任何运气。

【问题讨论】:

  • 不是每个修订历史都是针对company_id字段的,您可以先过滤掉它们,然后通过id获取公司
  • 也许我不清楚。我不是在寻找 company_id 字段中的更改。我正在尝试获取在Order 模型中进行更改的用户的Company。所有用户都有一个相关的公司。
  • 明白!刚刚回答。

标签: php laravel laravel-5 revisionable


【解决方案1】:

我认为当前版本的软件包无法做到这一点。

背后的原因是userResponsible()不是一个实际的关系,它只是一个返回User模型实例的函数。

为了允许预先加载,需要这样的东西:

public function userResponsible()
{
    if (class_exists($class = '\Cartalyst\Sentry\Facades\Laravel\Sentry')) {
        return $this->belongsTo(Config::get('sentry::users')['model'], 'user_id');
    } else if (class_exists($class = '\Cartalyst\Sentinel\Laravel\Facades\Sentinel')) {
        return $this->belongsTo(Config::get('sentinel::users')['model'], 'user_id');
    } else {
        return $this->belongsTo(Config::get('auth.model'), 'user_id');
    }
}

然后你就可以像这样急切加载:

$order = Order::with('revisionHistory.userResponsible.company')->find(1);

您可以在GitHub查看原始问题。

【讨论】:

    【解决方案2】:

    您可以使用$company = $revision->userResponsible()->company 获得User 的公司,以更改Order

    【讨论】:

    • 这是一个好的开始,我会尝试一下。但它似乎并不急于加载。
    猜你喜欢
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2018-09-08
    • 2021-11-14
    • 2019-08-10
    • 2017-06-28
    相关资源
    最近更新 更多