2016-11-05 2 views
2

Я очень новичок в Laravel и Eloquent, и я пытаюсь определить модель данных для записи из нее.Querying model, основанная на сложных отношениях

Я следующие таблицы

  • пользователь
  • задача
    • user_id
  • tasks_state
    • user_id
    • TASK_ID
    • состояние

В основном каждый пользователь может создать несколько задач, и каждая задача принадлежит ровно один пользователь. Тогда каждая задача может иметь несколько состояний задачи для каждого пользователя, который взаимодействует с ним. (Как и задачи рассматривается (другим пользователем) или аналогично)

Я определил модели следующим образом:

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

class User extends Model { 
    public function tasksState(){ 
     return $this->hasMany('App\TaskState'); 
    } 
    public function tasks(){ 
     return $this->hasMany('App\Task'); 
    } 
} 

Задача Модель

class Task extends Model { 
    public function user(){ 
     return $this->belongsTo('App\User'); 
    } 
    public function tasksState(){ 
     return $this->hasMany('App\TaskState'); 
    } 
} 

Состояние задачи Состояние

class TaskState extends Model { 
    public function user(){ 
     return $this->belongsTo('App\User'); 
    } 
    public function task(){ 
     return $this->belongsTo('App\Task'); 
    } 
} 

Затем, когда я вставляю состояние задачи, я делаю это следующим образом: (Правильно ли это?)

$task_viewed = new TaskState(); 
$task_viewed->state = $state; 
$task_viewed->user_id = $user->id; 

$task->tasksState()->save($task_viewed); 

Теперь я столкнулся вопрос: как извлечь все задачи для конкретного пользователь, который не был создан им, и он не взаимодействовал с ними - либо нет записи в таблице tasks_state, либо в состоянии задачи == 0.

Я также думаю, что, возможно, отношения между моделями неверны?

ответ

1

Вы можете сделать это с помощью метода: whereDoesntHave()

$tasks = Task::where('user_id', '<>', $userId) 
      ->whereDoesntHave('tasksState', function($q) use($userId) { 
       $q->where('user_id', $userId)->where('state', 0); 
      })->get(); 
+0

Не должно быть возможно сделать это в качестве одного запроса к базе данных вместо двух? Это кажется немного неэффективным ... – user3559787

+0

Второе решение больше похоже на то, что я ищу :-) Однако есть еще один вопрос. Теперь я думаю, что способ, которым я определял модели, должен был быть многим многим в случае таблицы tasks_state. Разве вы так не думаете? Также это облегчит решение? Я только что увидел пример с «красной» красноречивой функцией. – user3559787

+1

Я не знаю, что такое ваша структура данных, поэтому я не могу точно сказать, но это выглядит как отношение «многие ко многим», где 'tasks_state' является сводной таблицей. Если пользователь может взаимодействовать со многими задачами, и у каждой задачи много пользователей, то это много-ко-многим. –

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