2015-10-31 2 views
0

Я использую Красноречивый ОРМ и у меня есть Категория модель, которая подключается к Примечание модели, многие-ко-многим. У меня также есть модель User, которая подключается к Примечание: модель от многих до многих отношений и до Категория модель от одного до многих отношений.
Структура базы данных заключается в следующем:
заметки
идентификатор, название, содержание, created_at ....Eloquent отношения многие ко многим

категории
идентификатор, название, описание

пользователей
id, first_name, last_name ...

note_user
user_id, note_id, permission_id

category_note
category_id, note_id

note_permissions
permission_id, разрешения

Я пытаюсь получить:

  1. Все категории, содержащие примечания, которые имеют их идентификаторы, имеют определенный идентификатор пользователя в таблице user_note и проверяют allow_id этой строки.
  2. Получите все заметки для определенной категории, которые их идентификаторы существуют в таблице user_note с определенным идентификатором пользователя, и проверьте license_id этой строки.

Я написал метод, чтобы проверить, что разрешение определенного пользователя должен примечанию (в Примечании модели):

public function can($uid, $perm) 
{ 
    $users = $this->users()->get(); 
    foreach ($users as $user) { 
     if ($user->id == $uid) { // this user is shared 
      $permId = $user->pivot->permission_id; 
      $permissions = NotePerm::find($permId)->permissions; 
      $perm = 'note.' . $perm; 
      if (array_key_exists($perm, $permissions) && $permissions[ $perm ]) 
       return true; 
     } 
    } 
    return false; 
} 

Это моя идея извлечения всех категорий, которые содержат примечания, определенного пользователь может видеть (то есть есть строка в user_note с его ID пользователя и ноты ID, который принадлежит к этой категории) - этот метод помещается в Категория модель:

public function scopeWithNotesCan($query, $uid, $perm) 
{ 
    return $query->whereHas('notes', function ($query) use ($uid, $perm) { 
     $query->can($uid, $perm); 
    }); 
} 

И это вызов:

$categories->WithNotesCan($this->user->id, 'view'); 

Теперь, я получаю сообщение об ошибке:

Call to undefined method Illuminate\Database\Query\Builder::can()

Как я могу проверить каждую ноту с помощью пользовательского метода до получения всех заметок?

ответ

1

Выполнено с использованием нескольких вариантов использования.В модели Категория, добавили следующую сферу:

public function scopeForUser($query, $uid, $perm = 'view') 
{ 
    return $query->whereHas('notes', function ($query) use ($uid, $perm) { 
     $query->forUser($uid, $perm)->orWhere('private', '=', false); 
    }); 
} 

в модели Примечание, добавили следующую сферу:

public function scopeForUser($query, $uid, $perm = 'view') 
{ 
    $permissions = NotePerm::findWhere($perm); 
    return $query->whereHas('users', function ($query) use ($uid, $permissions) { 
     $query->where('note_user.user_id', $uid)->whereIn('note_user.permission_id', $permissions)->orWhere('private', '=', false); 
    }); 
} 

findWhere NotePerm метод получает массив всех разрешений содержащую определенную строку разрешений:

public function scopeFindWhere($query, $perm = 'view') 
{ 
    $permissions = self::all(); 
    $perm = 'note.' . $perm; 
    return $permissions->filter(function ($item) use ($perm) { 
     return array_key_exists($perm, $item->permissions) && $item->permissions[ $perm ]; 
    })->lists('id')->toArray(); 
} 

Таким образом, чтобы получить все категории, которые совместно с конкретным пользователем ($ пользователю является владельцем категорий, а не конкретного пользователя, мы ищем):

$user->categories()->forUser($this->user->id, $perm); 

Чтобы получить все ноты от конкретного категории, которые совместно используются конкретным пользователем:

$user->categories()->forUser($this->user->id, $perm)->notes()->forUser($this->user->id, $perm); 
Смежные вопросы