列名和关系名可以相同吗?
示例:
我在mack.phpmodel中有一个edited_by列,我想从用户表中获取edited_by中提到的用户的完整详细信息,所以我有如下关系
public function edited_by(){
return $this->hasOne('App\User','id','edited_by');
}
现在,如果我尝试访问 $model->edited_by->first_name 它会抛出错误“试图获取非对象的属性”
除了使用不同的名称之外,还有什么办法可以解决这个问题吗?
简短的回答是否定的。您不能让它们具有相同的名称,因为如果找到该列,则始终会返回该列,并且如果找到具有该名称的列,则永远不会返回该关系。
将列名改为user_id会比edited_by更合适。它更具描述性,也是 Eloquent 将查找的默认 id。同样,关系名称被命名为 user() 而不是 edited_by() 更有意义,因为它返回一个用户模型。
稍长且完全错误的答案是,您可以使用 $model->edited_by()->first_name 访问关系,但这将导致不必要地运行额外的查询。
您可以通过使用模型上的
getRelation
方法显式调用关系方法来实现此目的。这样,您可以确保您正在访问关系而不是直接访问列。具体方法如下:
// Assuming $model is an instance of the Mack model
$editedByRelation = $model->getRelation('edited_by');
// Now you can access the properties of the related User model
if ($editedByRelation) {
$firstName = $editedByRelation->first_name;
// Do whatever you need with $firstName
} else {
// Handle the case where the relationship is not loaded
}