2016-11-05 40 views
2

我對Laravel和Eloquent非常陌生,我試圖定義一個數據模型從中獲取記錄。基於複雜關係的查詢模型

我有如下表

  • 用戶
  • 任務
    • 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表的情況下應該是多對多的。你不這麼認爲嗎?它也會促進解決方案嗎?我剛看到一個帶有'pivot'雄辯功能的例子。 – user3559787

+1

我不知道你的數據結構究竟是什麼,所以我不能確定,但​​它看起來像多對多關係,其中'tasks_state'是一個數據透視表。如果用戶可以與許多任務交互,並且每個任務都有許多用戶,那麼它是多對多的。 –