Laravel多表数据过滤器

时间:2016-03-14 07:59:05

标签: php database laravel

我使用的是Laravel 5,我有3个数据库表SONAR_RUNNER_OPTSprojectsapplications,其表结构如下:

项目

users

应用

Schema::create('projects', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->text('description');
        $table->char('status',1);
        $table->timestamps();
});

用户

Schema::create('applications', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('project_id')->unsigned()->index();
        $table->integer('user_id')->unsigned()->index();
        $table->char('status');
        $table->timestamps();
});

现在,我想执行查询以返回特定用户尚未向该项目提交任何应用程序的所有项目。到目前为止,这是我可以获得的最接近的结果,但对于没有应用程序的每个项目,它将在Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->integer('role'); $table->string('name'); $table->string('email')->unique(); $table->string('password', 60); $table->rememberToken(); $table->timestamps(); }); 中返回NULL

projects.id

查询结果

DB::table('projects')
        ->leftjoin('applications', 'applications.project_id', '=', 'projects.id')
        ->where('applications.user_id', '!=', $user->id)
        ->orWhereNull('applications.id')
        ->get();

有没有人有解决方案?

2 个答案:

答案 0 :(得分:0)

DB::table('projects')
    ->leftjoin('applications', function($join){
        $join->on('applications.project_id', '=', 'projects.id')
            ->where('applications.user_id', '=', $user->id); 
    })
    ->whereNull('applications.id')
    ->get();

认为这就是你要找的东西

答案 1 :(得分:0)

我只是通过使用两个不同的查询并将它们组合在一起来弄清楚如何做到这一点。

1)选择所有用户应用程序的project_id

lst.sort()
print(lst)

2)选择项目不在上一个列表中的项目

$user_applications = Application::where('user_id', '=', $user->id)
        ->select('project_id as id')
        ->get();

查询结果(用户未申请项目2):

$projects_not_applied = DB::table('projects')
        ->whereNotIn('id',$user_applications)
        ->get();