我的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
字段。
有任何方法可以解决此问题,而无需更改访问者名称。
答案 0 :(得分:0)
我认为问题出现在你试图找回关系孩子时,为什么?因为supervisor
上有一个访问者,这是child
关系中的外键,所以当您要求这种关系时,Laravel
会尝试使用您的主管属性,因为它有一个访问器,它将触发而不是获得所需的属性(我猜是一个整数),你将获得NULL
或User
。我希望这能为你澄清一下。
一种解决方法是向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);
向我们提供表格的迁移,向我们展示关系。