Laravel 模型关系类未找到

Posted

技术标签:

【中文标题】Laravel 模型关系类未找到【英文标题】:Laravel model relationships Class not found 【发布时间】:2015-05-20 23:54:10 【问题描述】:

在 Laravel 中,我刚开始使用模型,我有这样的数据库结构:

users

id | username | password | group | //(group is the id of the group)


groups

id | groupname |


group_pages

group_id | page_id | create | read | update | delete


pages

id | pagename

我正在尝试检查用户是否可以在他所在的页面上创建/读取/更新/删除。

所以我目前有 4 个模型:UsersPagesGroup_pagesGroups。所以在模型中,我这样定义关系:

用户模型:

public function group()

    return $this->belongsTo('group', 'group', 'id');

组模型:

public function users()

    return $this->hasMany('users', 'group', 'id');


public function group_pages()

    return $this->hasMany('group_pages', 'group_id', 'id');

我在我的控制器中这样使用它:

$group_id = User::find(Session::get('user_id'));
$crud = Group::find($group_id->group)->group_pages()->first();

如the documentation 中所述。

但这给了我错误:

找不到类 group_pages

这里出了什么问题?

我不确定如何分配关系中的键。

我知道:

一对一逆向:

return $this->belongsTo('class', 'local_key', 'parent_key');

一对多:

return $this->hasMany('class', 'foreign_key', 'local_key'); 

我不知道一对多逆向。我知道它是:return $this->belongsTo('table');,但我不知道密钥。

Group_pages 模型:

class Group_pages extends Eloquent 

    public function pages()
    
        return $this->belongsTo('pages', 'id', 'group_id');
    

    public function group()
    
        return $this->belongsTo('group', 'id', 'group_id');
    


【问题讨论】:

这是因为您定义了与不存在的模型的关系。创建一个group_page-model(甚至更好的GroupPage)并更改对应关系(return $this->hasMany('GroupPage', 'group_id', 'id');在你的Group-model中 @nozzleman 创建此页面后,我确实做到了。等等,让我在问题中显示它。 好的,我猜这是要去哪里。让我回答。 【参考方案1】:

您定义了与不存在的模型类的关系。

要解决这个问题,请创建一个 group_page-model(甚至更好的 GroupPage)并更改对应关系(返回 $this->hasMany('GroupPage', 'group_id', 'id'); 在您的 Group-model 中。

然后修复User-model 中的关系:

public function group() // typo! not groep..

    return $this->belongsTo('group', 'group'); // remove id, you do not need it

那么你的控制器代码有问题,可以这样修复:

$group_id = User::find(Session::get('user_id'))->group()->id;
$crud = Group::find($group_id)->group_pages()->first();

我总是喜欢向 Laravel 的新手推荐 Laracasts(我希望你还不知道)。基本的截屏视频都是免费的(laravel 4 from scratch 和laravel 5 fundamendals),您很快就能学会!具体来说,请查看Eloquent Relationsships 上的剧集。

我也强烈建议遵守约定

    使用users 表上的列名group_id 作为组外键)。 类名应该是 PascalCase -> Group,而不是 group,并且在将它们作为参数提交时,坚持使用它 (belongsTo('Group'))...

这让生活更轻松!

终于

请注意,可能有您想要实现的目标的软件包。我想到的一个是 Entrust。

【讨论】:

使用该代码后,我得到:Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$id【参考方案2】:

这段代码让你的生活变得艰难,因此你无法让它工作。

先看看这个:

// This is User model, NOT group_id
$group_id = User::find(Session::get('user_id'));

下一步:

public function group() // I suppose groep was typo, right?

    // having relation with same name as the column
    // makes Eloquent unable to use the relation in fact
    return $this->belongsTo('group', 'group', 'id');

所以,这就是你需要的:

// User model
public function group()

    return $this->belongsTo('Group', 'group_id'); // rename column to group_id


// Group model
public function pages()

    return $this->belongsToMany('Page', 'group_pages')
        ->withPivot(['create', 'read', 'update', 'delete']);

然后:

$user = User::find(Session::get('user_id')); // or use Auth for this
$page = $user->group->pages()->find($currentPageId);
// now you can access pivot fields:
$page->pivot->create;
$page->pivot->update;
... and so on

【讨论】:

Groep 是一个错字,是的。我编辑了它。我从来不知道与列同名的关系使它无法使用。我现在得到一个错误:Call to a member function pages() on a non-object @Loko 如果你有 group 列,那么你不能使用 动态属性 $user->group 来引用关系,Eloquent 的默认方式是什么.无论如何-错误说,您没有与$user 相关的Group,仅此而已。【参考方案3】:

模型文件应以驼峰式命名,即UserPageGroup。表示用户和组之间连接的模型不是必需的。

那么在定义关系的时候,第一个参数就是模型的类名:

class User 

    public function group()
    
        return $this->belongsTo('Group', 'local_key', 'parent_key');
    

你违背了 Laravel 的约定,让自己的生活变得困难。

如果您按照 Laravel 的约定命名列,那么您也不需要在关系定义中指定它们。所以你的users 表应该有一个名为group_id 的列,它是引用groups 表中id 列的外键。你的关系可以这样表达:

class User 

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

更加简洁易读,而且您不必记住本地和外来列名的走向。

您可以在官方文档中阅读更多关于 Laravel 用于模型和关系名称的约定:http://laravel.com/docs/master/eloquent#relationships

【讨论】:

users中的group列是group表中id的外键。所以我现在可以忘记额外的参数了吗? 只要列名为group_id 而不仅仅是group,就可以。 好的,我做了所有这些,但它并没有真正回答我的主要问题,对吧?感谢您提供的信息 如果你按照 Laravel 所期望的方式命名它们,就会找到你的类。 函数本身也应该是单数的吧?

以上是关于Laravel 模型关系类未找到的主要内容,如果未能解决你的问题,请参考以下文章

Laravel单元测试类未找到错误

Laravel webwizo 简码包 Shortcodes 类未找到

Laravel - 渴望加载多态关系的相关模型

php artisan 抛出 FatalErrorException 类未找到

带有 Codeception 的 Laravel 4 模型单元测试 - 未找到“Eloquent”类

Laravel 5.4雄辩的一对多关系