具有预加载关系的Laravel模型



我有一个DB表,它存储我的职务,以免重复,而且职务模型内部有关系,所以当我使用Eloquent模型时,我必须反复调用或加载职务模型。是否有一种方法可以始终使用内部预装了职务的职务模型?

class Job extends Model
{
use Notifiable;
protected $fillable = [ ... ];
protected $hidden = [
'token',
];


public function title()
{
return $this->belongsTo('AppModelsJobTitle','job_title_id');
}
public function people()
{
return $this->belongsToMany('AppModelsPerson','job_person','job_id','person_id');
}

}

这是职务模型

class JobTitle extends Model
{
use Notifiable;
protected $table = "job_titles";
protected $primaryKey = 'job_title_id';
protected $fillable = [
'name',
];
protected $hidden = [
'token',
];

public function jobs()
{
return $this->hasMany('AppModelsJob','job_title_id');
}

}

现在我在控制器内部的代码看起来是这样的:

$job = Job::all()->load('title');

它工作得很好,但当我打电话给的工作人员时

$personJobs = Person::find(1)->jobs()->load('title')->get();

给出错误,有什么想法吗?

始终使用内部预加载JobTitle的作业模型。可以在作业模型中添加$with属性:

class Job extends Model
{
use Notifiable;

protected $with = ['title'];
}

load()在执行查询后执行。这叫做懒惰加载。热切加载使用with()

热切加载通常比懒惰加载快(我可能错了,如果我错了,请纠正我(。

此外,使用jobs()或任何其他关系,这将返回关系对象本身,而通过->Jobs访问它将执行关系查询,并返回集合(如果有多个(或模型(如果有一个(。

CCD_ 6不起作用的原因是;作业hasMany关系将加载";标题";因为CCD_ 7没有CCD_。

所以如果你想解决这个问题,你可以做Person::with('jobs.title')->find(1)Person::find(1)->load('jobs.title')

当通过方法$person->jobs()调用关系时,您最终会得到一个查询生成器,因此您不能调用像load()这样的模型方法,因为您没有模型的实例。

在得到第一个结果(嵌套的热切加载(之前调用关系会更有效

$person = Person::with('jobs.title')->find(1);
$personJobs = $person->jobs;

如果你不想从数据库中查询个人数据,你应该使用whereHas

$personJobs = Job::whereHas('people', function($personQueryBuilder) {
$personQueryBuilder->where('id',1);
})->with('title')->get();

相关内容

  • 没有找到相关文章

最新更新