Laravel 属于抛出未定义的错误

Posted

技术标签:

【中文标题】Laravel 属于抛出未定义的错误【英文标题】:Laravel belongs to throwing undefined error 【发布时间】:2014-09-21 11:07:15 【问题描述】:

我有 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');

);

这里有一些屏幕:

用户

表:

还有 users 表 FK

编辑

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

【问题讨论】:

向我们展示组架构。 我添加了组架构@TimWithers 【参考方案1】:

通过聊天帮助后,问题是存在一个名为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 等),并确保您的数据库中确实有相关条目。

【讨论】:

我已经尝试过了,但是使用User::find(1)->group->name得到错误Trying to get property of non-object 那么你的关系没有返回任何结果。确保您有一个与该员工关联的组。 但是当我使用group() 检索关系时,我可以在受保护的attributes 属性中看到相关用户,所以确定正在检索数据吗? $employee->group() 将返回 BelongsTo 类;它不会执行任何查询或查找任何相关的用户或组。确保您的users 表中有一个group_id 列,否则这种关系将不起作用。 在答案中添加了有关表名的信息。

以上是关于Laravel 属于抛出未定义的错误的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4 中的 Bllim DataTables 抛出未定义的 getQuery() 异常

为啥“”.abcd 返回未定义的值而不是在 Javascript 中抛出未定义的错误(但 Typescript 抛出警告)

自定义管理命令在虚拟环境中抛出未找到模块错误

React-native-maps 标记方法 animateMarkerToCoordinate 抛出未定义的错误

UICollectionView 使用自定义布局抛出未捕获的异常

bootstrap-datepicker 抛出未定义的 jQuery