基于多态关系的Laravel模型附加属性

基于多态关系的Laravel模型附加属性,laravel,polymorphism,Laravel,Polymorphism,我有一个模型课程,如下所示: class Course extends Model { protected $table = 'courses'; protected $primaryKey = 'id'; public $incrementing = true; public $timestamps = false; protected $appends = ['locked_by']; public function lock(){

我有一个模型
课程
,如下所示:

class Course extends Model {
    protected $table = 'courses';
    protected $primaryKey = 'id';
    public $incrementing = true;
    public $timestamps = false;

    protected $appends = ['locked_by'];

    public function lock(){
        return $this->morphMany('App\Models\Lock', 'asset');
    }

    public function getLockedByAttribute(){
        if($this->lock->count()){
            return $this->lock->shift()->owner_id;
        } else {
            return 0;
        }
    }
}
课程
可以有许多相关的
锁定
对象,指示用户希望锁定
课程
数据以供其他用户编辑

现在,从Laravel API检索特定课程的
课程
详细信息时,我得到以下数据:

    {
        "id": 1,
        "name": "Linear Algebra 2",
        "abbreviation": "2WF20",
        "status": "draft",
        "owner_id": 2,
        "created_at": "2020-03-10 13:09:15",
        "locked_by": 2,
        "lock": []
    }
虽然我期望:

    {
        "id": 1,
        "name": "Linear Algebra 2",
        "abbreviation": "2WF20",
        "status": "draft",
        "owner_id": 2,
        "created_at": "2020-03-10 13:09:15",
        "locked_by": 2
    }
正如您在代码中看到的,
“locked\u by”
属性不是来自
课程
表,而是由模型中的
$appends
变量添加的。
“locked by”
后面的数字是当前拥有该
课程
锁的用户的用户ID


谁能告诉我
“lock”:[]
属性来自何处以及如何摆脱它?我注意到自己的
“lock”:[]
属性不存在,如果
getLockedByAttribute()
函数不访问
$this->lock
,但是,我需要这个引用来获取拥有锁的用户的
用户id
?我做错什么了吗?我是否应该使用不同的方法来获取拥有锁的用户的
user\u id

响应中包含
lock
属性,因为为了获取
locked\u by
属性的值,模型需要加载
lock
关系

如果要在每次以数组或JSON形式返回
课程
模型时隐藏锁定关系,可以将该关系添加到
课程
模型的
$hidden
属性中

从:

有时您可能希望限制属性,例如密码, 包含在模型的数组或JSON表示中的。做 因此,将$hidden属性添加到模型中

隐藏关系时,请使用关系的方法名称

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Course extends Model
{
    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = ['lock'];
}
return App\Courses::with('lock')
    ->get()
    ->makeHidden('lock');