Laravel属于抛出未定义的错误

时间:2014-07-29 22:37:30

标签: php mysql sql laravel relationship

我有2个型号。

用户:

class User extends Eloquent implements UserInterface, RemindableInterface {

    protected $table = 'users';

    public function group () 
    {
        return $this->belongsTo('Group');
    }
}

和小组:

class Group extends Eloquent {
    protected $table = 'groups';
}

用户表在group列上有一个外键,该外键引用了组表上的id

架构可能会有所帮助

Schema::table('users', function ($table) {

    $table->foreign('group')
        ->references('id')
        ->on('groups')
        ->onDelete('cascade');

});

当我尝试使用以下内容获取用户组时:

User::find(1)->group()->name

我收到错误

Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$name

按要求提供的组架构:

Schema::create('groups', function ($table) {

    $table->increments('id');
    $table->string('name');
    $table->integer('permission');

});

以下是一些屏幕:

用户

enter image description here

群组表格:

enter image description here

用户表格FK

enter image description here

修改

@Cryode在聊天会话中为我解决了这个问题。问题是我的名字有冲突。模型方法使用与列名称(group)相同的名称。只需更改数据库中的列名即可解决问题。

1 个答案:

答案 0 :(得分:4)

在帮助聊天之后,问题是存在一个名为group的列,并且关系方法也称为group,因此表列值优先于关系方法。

将关系方法或group列重命名为group_id都是合适的解决方案(我建议使用group_id路线)。


原始答案:

您通过魔术属性检索组,而不是直接从方法中检索。

echo User::find(1)->group->name;

如果检索group()方法,它将返回关系对象,不执行任何查询并获取相关对象。

此外,Eloquent会假设你的外键列名是什么。 Group会自动转换为group_id列。如果您有一个名为group的现有列,那么您应该在您的关系中明确指定:

public function group () 
{
    return $this->belongsTo('Group', 'group');
}

如果您收到属性group的“试图获取非对象属性”错误,那么您的关系不会返回任何结果($user->group将为NULL)。此时,您应确保正确设置了您的关系(例如,使用正确的belongsTo,hasOne,hasMany等),并确保您的数据库中确实存在相关条目。