Laravel 4 Query Builder: LEFT JOIN... AND... query - программирование
Подтвердить что ты не робот

Laravel 4 Query Builder: LEFT JOIN... AND... query

Я пытаюсь выбрать все результаты из одной таблицы и объединить с другой таблицей, когда совпадает идентификатор пользователя.

У меня есть три таблицы: прогоны, пользователи и сводная таблица run_user. Я хочу выбрать все результаты из "прогонов" и дополнительных столбцов в сводной таблице (которые "завершены", "липкие", "last_tested" и "трудность" ), но только извлекают данные из run_user для текущего пользователя.

В сыром SQL я смог сделать это через LEFT JOIN с инструкцией AND:

SELECT
runs.startpoint,
runs.startpostcode,
runs.endpoint,
runs.endpostcode,
run_user.completed,
run_user.sticky,
run_user.last_tested,
run_user.difficulty
FROM runs
LEFT JOIN run_user ON run_user.run_id=runs.id AND run_user.user_id = '2'

Любые предложения, как это сделать с помощью Query Builder? Я могу сделать LEFT JOIN в Laravel 4, но не могу понять, как совместить это с инструкцией AND.

Любая помощь приветствуется.

Спасибо!

4b9b3361

Ответ 1

Как вы просили, так вы будете делать свой запрос с построителем запросов:

DB::table('runs')
        ->leftJoin('run_user', function($join)
        {
            $join->on('run_user.run_id', '=', 'runs.id')
            ->on('run_user.user_id', '=', '2');
        })
        ->get();

Но этот оператор JOIN выглядит немного странным, вы, вероятно, захотите превратить его в нормальное WHERE (если у вас нет особых причин для фильтрации непосредственно в предложении JOIN).

DB::table('runs')->join('run_user', 'run_user.run_id', '=', 'runs.id')->where('run_user.user_id', '=', '2')->get();

Документы: http://laravel.com/docs/queries#joins

Ответ 2

В случае, если кому-то интересно, я получил эту работу, используя DB:: raw для одного из параметров leftJoin:

DB::table('runs')
    ->leftjoin('run_user', 'runs.id','=', 
      DB::raw('run_user.run_id AND run_user.user_id = ' . $user->id))
    ->get();

Это не так "красноречиво", как мне бы хотелось, но без рабочего состояния "andOn" это кажется единственным способом, если вы хотите добавить AND в LEFT JOIN.

Если кто-нибудь может предложить более аккуратный способ, я бы с удовольствием узнал!

Спасибо

Ответ 3

В Laravel 4 вы можете сделать это с помощью запроса Eloquent. Я предполагаю, что вы знаете о взаимоотношениях с людьми и знаете, как создавать модели. Для вашего запроса это должно быть

RunUser::where('user_id',$id)->leftjoin('runs','runs.id','=','run_user.run_id')->first();

Примечание RunUser - это модель для таблицы run_user.

Ответ 4

Таблица Provident и User Join и получите идентификатор ко всем деталям.

   $return = DB::table(config::get('databaseconstants.TBL_USER'))
            ->leftjoin('inex_pf_details', 'inex_users.id', '=', 'inex_pf_details.pf_user_id')
            ->select('inex_pf_details.*','inex_users.*')
            ->where('inex_pf_details.id', $id)
            ->first();
    return $return;

Ответ 5

используйте этот

DB::table('runs')->select('runs.startpoint','runs.startpostcode','runs.endpoint','runs.endpostcode','run_user.completed','run_user.sticky','run_user.last_tested','run_user.difficulty')
    ->leftJoin('run_user', function($join)
    {
        $join->on('run_user.run_id', '=', 'runs.id')
        ->where('run_user.user_id', '2');
    })
    ->get();

Ответ 6

Здесь должна работать:

DB::table('runs')
        ->leftJoin('run_user', function($join) use ($user_id)
        {
            $join->on('run_user.run_id', '=', 'runs.id')
            ->where('run_user.user_id', '=', $user_id);
        })
        ->get();