假设我有一个 Course
像这样的模型:
class Course extends Model
{
public $primaryKey = 'course_id';
protected $appends = ['teacher_name'];
public function getTeacherNameAttribute ()
{
$this->attributes['teacher_name'] = $this->teacher()->first()->full_name;
}
public function teacher ()
{
return $this->belongsTo('App\User', 'teacher', 'user_id');
}
}
另一方面,还有一个
User
像这样的模型:class User extends Authenticatable
{
public $primaryKey = 'user_id';
protected $appends = ['full_name'];
public function getFullNameAttribute ()
{
return $this->name . ' ' . $this->family;
}
public function course ()
{
return $this->hasMany('App\Course', 'teacher', 'user_id');
}
}
如您所见,有一个
hasMany
那些之间的关系。有一个
full_name
用户模型中的访问器。现在我想添加一个
teacher_name
访问 Course
使用它的模型是 teacher
关系和获取 full_name
教师并附加到 Course
总是。事实上我想每次调用
Course
模型,它与其他属性一样包含相关的教师名称。但是每次调用 Course 模型时,我都会收到此错误:
exception 'ErrorException' with message 'Trying to get property of non-object' in D:\wamp\www\lms-api\app\Course.php:166
那是指这一行 Course 模型:
$this->attributes['teacher_name'] = $this->teacher()->first()->full_name;
我不知道我该如何解决这个问题以及究竟是什么问题。
最佳答案
嗯,这里有一些有趣的答案。
仅供跟随我的人- getFooAttribute()
应该返回数据,而不是修改内部属性数组。
如果您在属性数组中设置一个新值(该值在此模型的 db 架构中不存在),然后尝试保存模型,您将遇到查询异常。
值得阅读 attribute accessors/mutators 上的 Laravel 文档了解更多信息。
此外,如果您需要从模型中访问相关对象(例如在访问器中),您应该调用 $related = $this->getRelation('foo');
- 请注意,如果未加载关系(例如,如果您没有使用急切加载的关系获取此对象/集合),则 $this->getRelation()
可能返回 null,但至关重要的是,如果它被加载,它将不会运行相同的查询来再次获取数据。所以把它与 if (!$this->relationLoaded('foo')) { $this->loadRelation('foo'); }
结合起来.然后,您可以像往常一样与相关的对象/集合进行交互。
关于php - 在 Laravel 的模型访问器中使用关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43862597/