Laravel 关系已加载,但调用时返回null
我查询一个模型“版税”,并急切地加载关系“所有者”。模型返回结果,包括关系Laravel 关系已加载,但调用时返回null,laravel,eloquent,relationship,eager-loading,Laravel,Eloquent,Relationship,Eager Loading,我查询一个模型“版税”,并急切地加载关系“所有者”。模型返回结果,包括关系 class Royalty extends Model { protected $guarded = []; protected $dates = ['created_at', 'updated_at', 'date', 'calculated_at']; protected $casts = [ 'properties' => 'object', ];
class Royalty extends Model
{
protected $guarded = [];
protected $dates = ['created_at', 'updated_at', 'date', 'calculated_at'];
protected $casts = [
'properties' => 'object',
];
public function owner()
{
return $this->belongsTo(Owner::class);
}
}
class Owner extends Model
{
use SoftDeletes;
protected $guarded = [];
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
protected $casts = [
'properties' => 'object',
];
public function royalties()
{
return $this->hasMany(Royalty::class);
}
}
$royalty = Royalty::with('owner')->where('id', 1)->first();
结果与预期一致,并加载关系“所有者”:
Royalty {#542 ▼
#guarded: []
#dates: array:4 [▶]
#casts: array:1 [▶]
#connection: "development"
#table: "royalties"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:21 [▶]
#original: array:21 [▶]
#changes: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: array:1 [▼
"owner" => Owner {#562 ▼
#guarded: []
#dates: array:4 [▶]
#casts: array:1 [▶]
#connection: "development"
#table: "owners"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
#perPage: 15
+exists: true
+wasRecentlyCreated: false
#attributes: array:8 [▶]
#original: array:8 [▶]
#changes: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
#forceDeleting: false
}
]
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
}
但是,当我调用与$royalty->owner的关系时,结果为NULL。我做错了什么
dd($royalty->owner); NULL
您必须使用可填充而不是防护
class Royalty extends Model
{
protected $fillable = [ 'id', ...];
protected $dates = ['created_at', 'updated_at', 'date', 'calculated_at'];
protected $casts = [
'properties' => 'object',
];
public function owner()
{
return $this->belongsTo(Owner::class);
}
}
发生这种情况的主要原因有两个
- 其一是数据库中的信息已被删除
- 您在模型
中重载了Owner
方法(我知道您的示例中没有)toArray()
- 你必须这样定义你的关系,
在版税模型中,请定义
public function owner()
{
返回$this->belongsTo(Owner::class,'Owner\u id');
}
并将id
作为所有者模型中的可填充项
还有你的
public function版税()
{
返回$this->hasMany(版税::类);
}
是完美的尝试dd($royalty['owner'])
当我进行dd($royalty['owner'])时也为空。你能从你的控制器和表结构中提供代码吗?额外信息:当我尝试$owner=$royalty->owner()->first()时;我得到了预期的主人。因此,这种关系似乎没有什么问题?版税
表是否有一个所有者
列?我将$guarded更改为$fillable,包含所有列。但结果仍然为空…在控制器中可填充后,必须在查询后写入。dd(特许权使用费);当我做dd($royalty->owner)时,我仍然得到空值。但是,当我进行dd($royalty)…时,所有者是可用的。我可以确认数据库没有更改。另外,我在所有者模型中没有对toArray()的任何引用……您是否尝试删除$cast属性<代码>受保护的$casts=[“属性”=>“对象”,]代码>运行编写器更新,这不是脚本的正常行为/laravel@Arjan有更新吗?你找到这种行为的原因了吗?没有,我更新了作曲家,但问题仍然存在。非常奇怪,因为似乎与版税模型的某些其他关系正常工作。@Arjan在您的模型中,您没有指定任何可填充列,至少为两个模型指定一个可填充列。我已经将两个模型都更改为受保护的$filleble=['id']。当我可以看到关系被加载时,仍然是空的…@Arjan不仅id
将一些数据填充到一个新列中,如name
或其他任何其他列。还是空的!