簡體   English   中英

Laravel模型關系未找到類

[英]Laravel model relationships Class not found

在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();

文檔所述

但這給了我錯誤:

找不到類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');
    }

}

模型文件應單獨命名並以駝峰形式命名,即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

您使用不存在的模型類定義了您的關系。

要解決此問題,請創建group_page-model(或更好的GroupPage)並更改相應的關系(在Group-model中返回$ this-> hasMany('GroupPage','group_id','id');

然后在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的新手(我希望你還不知道)。 基本的截屏視頻都是免費的( laravel 4 from scratch and laravel 5 fundamendals ),你很快就能快速出鏡! 具體來說,看一下關於Eloquent Relationsships的劇集。

我也強烈建議堅持慣例

  1. 在group-foreign-key的users group_id上使用column-name group_id
  2. 類名應該是PascalCase - > Group ,而不是group ,當把它們作為參數提交時,堅持它( belongsTo('Group') )...

這讓生活更輕松!

最后

請注意,您可能會嘗試使用軟件包。 我想到的是Entrust。

你用這個代碼讓你的生活變得艱難,因此你無法使它生效。

首先檢查一下:

// 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM