php - 在 Laravel 的模型访问器中使用关系

标签 php laravel laravel-5.4

假设我有一个 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/

相关文章:

php - 如何将代码包装在函数内使该代码不起作用?

php - 拉拉维尔 5 : AppServiceProvider vs custom provider

php - 调用未定义的方法 Illuminate\Database\Query\Builder::notify() Laravel 5.4

mysql - 如何在 Laravel 下拉列表中填充数据库值

php - 如何在 Laravel 5.4 中验证文件名

php - URL 编码在 >>> 构造中

php - Mysql 用 Select 插入

Laravel Passport,通过密码客户端进行多个连接

php - 在 Laravel 数据表中添加 HTML 属性

php - 调用服务时出现错误 101