2016-03-14 2 views
0

Я использую Laravel 5 и у меня есть 3 таблицы базы данных projects, applications, users и их структура таблицы, как следует:Laravel фильтр несколько таблиц данных

Проекты

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(); 

Результат запроса

{ 
    "total":1, 
    "per_page":5, 
    "current_page":1, 
    "last_page":1, 
    "next_page_url":null, 
    "prev_page_url":null, 
    "from":1,"to":1, 
    "data":[{ 
     "id":null, 
     "name":"Project2", 
     "description":"Project2 detail", 
     "status":null, 
     "created_at":null, 
     "updated_at":null, 
     "project_id":null, 
     "user_id":null 
    }] 
} 

ли кто-нибудь имеет решение этой проблемы?

ответ

0

Я просто выяснить, как сделать это с помощью двух различных запросов и объединил их вместе.

1) Выбрать все пользовательские приложения PROJECT_ID

$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(); 

Результат запроса (пользователь не применяется для проекта 2):

[{ 
    "id":"2", 
    "name":"Project2", 
    "description":"Project2 detail", 
    "status":"n", 
    "created_at":"2016-03-14 15:09:58", 
    "updated_at":"2016-03-14 15:09:58" 
}] 
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(); 

Подумайте, что это то, что ищете

+0

этот запрос по-прежнему дает мне тот же результат с 'project.id' =' NULL' :( – Woody

+0

как вы пытаетесь получить это значение – Chris

+0

Извините, что вы подразумеваете под этим? Я не совсем понимаю ваш вопрос – Woody

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