Laravel 的可修订历史中的预加载相关模型
Eager load related models in Laravel's Revisionable history
使用 Laravel 5.4 和 VentureCraft/revisionable 包。
我有 3 个模型:User
、Company
和 Order
。
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 覆盖各种方法(例如 revisionHistory
和 identifiableName
),但没有成功。
您可以使用 $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 中查看原始问题。
使用 Laravel 5.4 和 VentureCraft/revisionable 包。
我有 3 个模型:User
、Company
和 Order
。
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 覆盖各种方法(例如 revisionHistory
和 identifiableName
),但没有成功。
您可以使用 $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 中查看原始问题。