Laravel 的可修订历史中的预加载相关模型

Eager load related models in Laravel's Revisionable history

使用 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 trait 覆盖各种方法(例如 revisionHistoryidentifiableName),但没有成功。

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

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

背后的原因是 userResponsible() 不是实际的关系,它只是 returns 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 中查看原始问题。