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.
Любая помощь приветствуется.
Спасибо!
Ответы
Ответ 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();