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 个模型:Users、Pages、Group_pages 和 Groups。所以在模型中,我这样定义关系:
用户模型:
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】:
模型文件应以驼峰式命名,即User
、Page
、Group
。表示用户和组之间连接的模型不是必需的。
那么在定义关系的时候,第一个参数就是模型的类名:
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 webwizo 简码包 Shortcodes 类未找到
php artisan 抛出 FatalErrorException 类未找到