0

我有一个数据库表来存储我的职位,以免重复它们,并且 Job 模型在内部有关系,所以当我使用 Eloquent 模型时,我必须总是一遍又一遍地调用或加载 JobTitles 模型。有没有办法始终使用内部预加载 JobTitles 的 Job 模型?

    class Job extends Model
    {
        use Notifiable;

        protected $fillable = [ ... ];

        protected $hidden = [
        'token',
        ];


    
        public function title()
        {
            return $this->belongsTo('App\Models\JobTitle','job_title_id');
        }

        public function people()
        {
            return $this->belongsToMany('App\Models\Person','job_person','job_id','person_id');
        }
        
    }

这是 JobTitle 模型

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('App\Models\Job','job_title_id');
    }

    
}

现在我在控制器中的代码如下所示:

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

它工作正常,但是当我打电话给人们的工作时

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

给出错误,任何想法如何做到这一点?

4

3 回答 3

1

当通过该方法调用关系时,$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();
于 2021-04-25T14:52:12.720 回答
1

load()在执行查询后执行。这称为延迟加载。急切加载正在使用with().

急切加载通常比延迟加载快(我可能在这方面错了,如果我错了,请纠正我)。

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

$personJobs = Person::find(1)->jobs()->load('title')->get();不起作用的原因是因为您本质上是在说“工作有很多关系将加载由于hasMany没有load()功能而不起作用的“标题”。

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

于 2021-04-25T15:15:36.160 回答
0

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

class Job extends Model
{
   use Notifiable;
   
   protected $with = ['title'];

}
于 2022-01-08T15:01:51.337 回答