Laravel 列名称和关系名称相同

问题描述 投票:0回答:2

列名和关系名可以相同吗?

示例:

我在mack.phpmodel中有一个edited_by列,我想从用户表中获取edited_by中提到的用户的完整详细信息,所以我有如下关系

public function edited_by(){
        return $this->hasOne('App\User','id','edited_by');
    }

现在,如果我尝试访问 $model->edited_by->first_name 它会抛出错误“试图获取非对象的属性”

除了使用不同的名称之外,还有什么办法可以解决这个问题吗?

laravel relationship
2个回答
7
投票

简短的回答是否定的。您不能让它们具有相同的名称,因为如果找到该列,则始终会返回该列,并且如果找到具有该名称的列,则永远不会返回该关系。

将列名改为user_id会比edited_by更合适。它更具描述性,也是 Eloquent 将查找的默认 id。同样,关系名称被命名为 user() 而不是 edited_by() 更有意义,因为它返回一个用户模型。

稍长且完全错误的答案是,您可以使用 $model->edited_by()->first_name 访问关系,但这将导致不必要地运行额外的查询。


0
投票

您可以通过使用模型上的

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
}
© www.soinside.com 2019 - 2024. All rights reserved.