2015-03-18 3 views
1

В Laravel я только начал с моделями и у меня есть эта структура базы данных: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 модели для этого в данный момент: пользователей, Страницы, Group_pages и группы. Таким образом, в модели, я определить отношения как так:

модель Пользователь:

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

Group Модель:

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.

, но это дает мне ошибку:

Class group_pages not found

Что происходит здесь не так?

Я не уверен в назначении ключей в отношениях.

Я знаю, что это:

Один к одному Inverse:

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

Один ко многим:

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

Я не знаю, о один ко многим Inverse , Я знаю, что это: 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'); 
    } 

} 
+0

это потому, что вы определяете ваши отношения с моделью, которая не существует. Создайте модель 'group_page' (или даже лучше' GroupPage') и измените соответствующее соотношение ('return $ this-> hasMany ('GroupPage', 'group_id', 'id');' в вашей модели 'Group' – nozzleman

+0

@nozzleman После того, как я создал эту страницу, я действительно сделал. Подождите, покажите это в вопросе. – Loko

+0

ОК, я думаю, где это будет. Позвольте мне ответить. – nozzleman

ответ

3

. Файлы моделей должны быть названы сингулярно и в верблюжьем футляре, то есть User, , Group. Модель, представляющая соединение между пользователями и группами, не требуется.

Тогда, когда речь идет об определении отношений, то первый параметр является именем класса модели:

class User { 

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

Вы делаете жизнь трудной для себя, идя против конвенций Laravel в.

Если вы называете свои столбцы в соответствии с соглашениями Laravel, вам также не нужно указывать их в ваших определениях отношений. Таким образом, ваша таблица users должна иметь столбец с именем group_id, который является внешним ключом, ссылающимся на столбец id в вашей таблице groups.Ваши отношения могут быть выражены следующим образом:

class User { 

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

Много лаконичнее и проще читать, и вы не должны помнить, какой путь вокруг местной и иностранной колонки имена идут.

Вы можете прочитать больше о конвенциях Laravel использует для модели и соотношения имен в официальной документации: http://laravel.com/docs/master/eloquent#relationships

+0

Столбец группы пользователей является внешним ключом идентификатора в таблице групп. Так что теперь я могу просто забыть о дополнительных параметрах? – Loko

+0

Пока столбец называется 'group_id', а не просто' group', да. –

+0

Хорошо, я сделал все это, но на самом деле это не отвечает на мой главный вопрос? Спасибо за информацию, хотя – Loko

0

Вы определили свои отношения с моделью-класса, который не существует.

Чтобы решить эту проблему, создайте модель group_page (или даже лучше GroupPage) и измените соответствующую взаимосвязь (возвращайте $ this-> hasMany ('GroupPage', 'group_id', 'id'), внутри вашей групповой модели ,

Тогда исправить отношения в вашей User -модели:

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

Я всегда хотел бы рекомендовать Laracasts для людей, которые не знакомы с Laravel (надеюсь, вы еще этого не знаете). Основные скринкасты бесплатны (laravel 4 from scratch и laravel 5 fundamendals), и вы скоро сможете быстро найти! В частности, посмотрите на эпизод на Eloquent Relationsships.

Я также настоятельно рекомендую придерживаться конвенций

  1. использовать имя-столбца group_id на users -стол для группового внешнего ключа).
  2. имена классов должны быть PascalCase ->Group, не group, и при фиксации их можно использовать параметры, прилипают к ней (belongsTo('Group')) ...

Это делает жизнь намного проще!

Наконец

Имейте в виду, что там могут быть пакеты для того, что вы пытаетесь достичь. Тот, который приходит мне на ум, - это Entrust.

+0

Теперь я получаю: 'Undefined property: Illuminate \ Database \ Eloquent \ Relations \ BelongsTo :: $ id' после использования этого кода. – Loko

+0

Также см. Мое редактирование о модели group_page – Loko

+0

обновил мой ответ – nozzleman

0

Вы делаете свою жизнь тяжело с этим кодом, и поэтому вы не можете заставить ее работать.

Проверьте это первая:

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

Groep был опечаткой, да, я его редактировал. Я никогда не знал об отношении, имеющем то же имя, что и столбец не позволяет использовать. И теперь я получаю сообщение об ошибке: «Вызовите страницы-члены-члены() для объекта, не являющегося объектом. – Loko

+0

@Loko Если у вас есть столбец« группа », то вы не можете использовать ** dynamic свойство ** '$ user-> group' для ссылки что отношение по умолчанию, как это делает Красноречивый. В любом случае - ошибка говорит, что у вас нет 'Group', связанного с' $ user', вот и все. –

Смежные вопросы