被认为是OneToMany关系中定义的外键的存取器

时间:2018-02-14 07:42:54

标签: php laravel laravel-5.5

我的User模型包含以下字段:

user_id
username
name
family
supervisor

在那个模型中,我定义了一个与supervisor属性相同的访问者(因为我想将supervisor用户作为User对象返回而不是简单的id):

public function getSupervisorAttribute($value)
{
    return is_null($value) ? null : User::select('user_id', 'name', 'family')->find($value);
}

另一方面,有一个像这样的 OneToMany 关系:

public function child()
{
    return $this->hasMany(self::class, 'supervisor', 'user_id');
}

现在每次调用 child()关系时,都会返回Illegal offset type错误。似乎在 hasMany 方法的第二个参数中无法识别supervisor字段。

有任何方法可以解决此问题,而无需更改访问者名称。

2 个答案:

答案 0 :(得分:0)

我认为问题出现在你试图找回关系孩子时,为什么?因为supervisor上有一个访问者,这是child关系中的外键,所以当您要求这种关系时,Laravel会尝试使用您的主管属性,因为它有一个访问器,它将触发而不是获得所需的属性(我猜是一个整数),你将获得NULLUser。我希望这能为你澄清一下。

一种解决方法是向appends添加Model属性,然后在该属性上添加mutator和accessors。

答案 1 :(得分:0)

如果User有孩子,那么它是一对多(他/她可以有很多孩子或没有孩子)

反正
让我们假设您有一个名为Children的表,确保您更改了模型中的表名(laravel假定它是数据库中的子项)。

如果public function child() {}模型中有User,那么

/* 
 * children since he/she can have many children
 * hasMany means this model has many of the other model by self::class
 * it's as if you're saying this model has many of this model so change it 
 */
public function children()
{
    /* you're building a relationship between User('user_id' as local primary key) 
     * and Children('parent_id' as foreign key) 
     * means children table has foreign key parent_id(unsignedInt)
     * it returns an array of all the children objects of this User row
     */
    return $this->hasMany('Children', 'parent_id', 'user_id');
}

另一方面Children模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Children extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
     protected $table = 'children';

     public function parent()
     {
         // belongsTo means 'parent_id' in this model(Children) relates to 'user_id' on 'User' model
         // it returns the User object which is the parent of this child row
         return $this->belongsTo('User', 'user_id', 'parent_id');
     }
}

此解决方案用于创建另一个表,但似乎您希望它使用相同的表(它不是很清楚编辑您的帖子)。

// this function makes no sense, it takes an integer and finds the parameter to was given
$userWithIdOne = $user->getSupervisorAttribute(1);

向我们提供表格的迁移,向我们展示关系。