基于复杂关系查询模型

时间:2016-11-05 12:55:51

标签: laravel laravel-5 eloquent

我是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 个答案:

答案 0 :(得分:1)

您可以使用whereDoesntHave()方法执行此操作:

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