Laravel join 和 left join 在查询中一起使用
Laravel join and left join together in a query
我有一个 sql 查询,我想将其转换为查询生成器或 Laravel ORM。它工作正常。但我希望它成为查询生成器形式或 ORM。是否可以在查询生成器或 ORM 中编写?
我有四个表答案、问题、用户和 upvote_answers。查询有三个 'joins' 和一个 'left join' 只是为了检查当前登录的用户是否已投票(布尔)答案以及其他属性
SELECT answers.answer_content as answer_content,
answers.id as answer_id,
answers.created_at as created_at,
answers.created_at as answer_upvote,
answers.created_at as answer_downvote,
questions.id as question_id,
questions.question_title as question_title,
questions.question_slug as question_slug,
users.id as user_id,
users.name as user_name,
users.user_slug as user_slug,
upvote_answers.upvote as upvote
FROM
answers
JOIN questions on questions.id = answers.question_id
JOIN users on users.id = answers.user_id
LEFT JOIN upvote_answers ON
upvote_answers.answer_id = answers.id AND
upvote_answers.user_id = '2'
WHERE
questions.question_active = 1 and
answers.answer_active = 1
使用连接子句
https://laravel.com/docs/master/queries#joins
简单示例
$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->where('users.id', '=', 100)
->get();
你也可以使用 Left Join Clause。
更新:
$yourQuery = \DB::table('answers')
->join('questions', 'questions.id', '=', 'answers.question_id')
->join('users', 'users.id', '=', 'answers.user_id')
->leftJoin('upvote_answers', 'upvote_answers.answer_id', '=', 'answers.id')
->where('questions.question_active', '=', '1')
->where('answers.answer_active', '=', '1')
->selectRaw('answers.answer_content as answer_content,
answers.id as answer_id,
answers.created_at as created_at,
answers.created_at as answer_upvote,
answers.created_at as answer_downvote,
questions.id as question_id,
questions.question_title as question_title,
questions.question_slug as question_slug,
users.id as user_id,
users.name as user_name,
users.user_slug as user_slug,
upvote_answers.upvote as upvote');
echo $yourQuery->toSql(); //generated sql query as string
//$yourQuery->get(); //for get data from db
结果:
select answers.answer_content as answer_content, answers.id as
answer_id, answers.created_at as created_at, answers.created_at as
answer_upvote, answers.created_at as answer_downvote, questions.id as
question_id, questions.question_title as question_title,
questions.question_slug as question_slug, users.id as user_id,
users.name as user_name, users.user_slug as user_slug,
upvote_answers.upvote as upvote from answers inner join questions on
questions.id = answers.question_id inner join users on users.id =
answers.user_id left join upvote_answers on upvote_answers.answer_id =
answers.id where questions.question_active = ? and
answers.answer_active = ?
如果需要upvote_answers.user_id = '2'
在leftJoin中必须使用advance left join:
->leftJoin('upvote_answers', function($advancedLeftJoin){
$advancedLeftJoin->on('users.id', '=', 'contacts.user_id')
->where('upvote_answers.user_id', '=', 2);
})
最后,你的例子的答案是:
$yourQuery = \DB::table('answers')
->join('questions', 'questions.id', '=', 'answers.question_id')
->join('users', 'users.id', '=', 'answers.user_id')
->leftJoin('upvote_answers', function($advancedLeftJoin){
$advancedLeftJoin->on('users.id', '=', 'contacts.user_id')
->where('upvote_answers.user_id', '=', 2);
})
->where('questions.question_active', '=', '1')
->where('answers.answer_active', '=', '1')
->selectRaw('answers.answer_content as answer_content,
answers.id as answer_id,
answers.created_at as created_at,
answers.created_at as answer_upvote,
answers.created_at as answer_downvote,
questions.id as question_id,
questions.question_title as question_title,
questions.question_slug as question_slug,
users.id as user_id,
users.name as user_name,
users.user_slug as user_slug,
upvote_answers.upvote as upvote');
echo $yourQuery->toSql(); //generated sql query as string
//dd($yourQuery->get()); //result as collection
结果:
select answers.answer_content as answer_content, answers.id as
answer_id, answers.created_at as created_at, answers.created_at as
answer_upvote, answers.created_at as answer_downvote, questions.id as
question_id, questions.question_title as question_title,
questions.question_slug as question_slug, users.id as user_id,
users.name as user_name, users.user_slug as user_slug,
upvote_answers.upvote as upvote from answers inner join questions on
questions.id = answers.question_id inner join users on users.id =
answers.user_id left join upvote_answers on users.id =
contacts.user_id and upvote_answers.user_id = ? where
questions.question_active = ? and answers.answer_active = ?
?
使用后绑定值 ->get()
使用查询生成器,您可以将查询编写为
DB::table('answers as a')
->join('questions as q', 'q.id', '=', 'a.question_id')
->join('users as u', 'u.id', '=', 'a.user_id')
->leftJoin('upvote_answers as ua', function ($join) {
$join->on('ua.answer_id', '=', 'a.id')
->where('ua.user_id', '=', 2);
})
->where('q.question_active', '=', 1)
->where('a.answer_active', '=', 1)
->select(DB::raw('a.answer_content as answer_content,a.id as answer_id,a.created_at as created_at,a.created_at as answer_upvote,a.created_at as answer_downvote,q.id as question_id, q.question_title as question_title, q.question_slug as question_slug, u.id as user_id, u.name as user_name, u.user_slug as user_slug,ua.upvote as upvote'))
->get();
我有一个 sql 查询,我想将其转换为查询生成器或 Laravel ORM。它工作正常。但我希望它成为查询生成器形式或 ORM。是否可以在查询生成器或 ORM 中编写?
我有四个表答案、问题、用户和 upvote_answers。查询有三个 'joins' 和一个 'left join' 只是为了检查当前登录的用户是否已投票(布尔)答案以及其他属性
SELECT answers.answer_content as answer_content,
answers.id as answer_id,
answers.created_at as created_at,
answers.created_at as answer_upvote,
answers.created_at as answer_downvote,
questions.id as question_id,
questions.question_title as question_title,
questions.question_slug as question_slug,
users.id as user_id,
users.name as user_name,
users.user_slug as user_slug,
upvote_answers.upvote as upvote
FROM
answers
JOIN questions on questions.id = answers.question_id
JOIN users on users.id = answers.user_id
LEFT JOIN upvote_answers ON
upvote_answers.answer_id = answers.id AND
upvote_answers.user_id = '2'
WHERE
questions.question_active = 1 and
answers.answer_active = 1
使用连接子句
https://laravel.com/docs/master/queries#joins
简单示例
$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->where('users.id', '=', 100)
->get();
你也可以使用 Left Join Clause。
更新:
$yourQuery = \DB::table('answers')
->join('questions', 'questions.id', '=', 'answers.question_id')
->join('users', 'users.id', '=', 'answers.user_id')
->leftJoin('upvote_answers', 'upvote_answers.answer_id', '=', 'answers.id')
->where('questions.question_active', '=', '1')
->where('answers.answer_active', '=', '1')
->selectRaw('answers.answer_content as answer_content,
answers.id as answer_id,
answers.created_at as created_at,
answers.created_at as answer_upvote,
answers.created_at as answer_downvote,
questions.id as question_id,
questions.question_title as question_title,
questions.question_slug as question_slug,
users.id as user_id,
users.name as user_name,
users.user_slug as user_slug,
upvote_answers.upvote as upvote');
echo $yourQuery->toSql(); //generated sql query as string
//$yourQuery->get(); //for get data from db
结果:
select answers.answer_content as answer_content, answers.id as answer_id, answers.created_at as created_at, answers.created_at as answer_upvote, answers.created_at as answer_downvote, questions.id as question_id, questions.question_title as question_title, questions.question_slug as question_slug, users.id as user_id, users.name as user_name, users.user_slug as user_slug, upvote_answers.upvote as upvote from answers inner join questions on questions.id = answers.question_id inner join users on users.id = answers.user_id left join upvote_answers on upvote_answers.answer_id = answers.id where questions.question_active = ? and answers.answer_active = ?
如果需要upvote_answers.user_id = '2'
在leftJoin中必须使用advance left join:
->leftJoin('upvote_answers', function($advancedLeftJoin){
$advancedLeftJoin->on('users.id', '=', 'contacts.user_id')
->where('upvote_answers.user_id', '=', 2);
})
最后,你的例子的答案是:
$yourQuery = \DB::table('answers')
->join('questions', 'questions.id', '=', 'answers.question_id')
->join('users', 'users.id', '=', 'answers.user_id')
->leftJoin('upvote_answers', function($advancedLeftJoin){
$advancedLeftJoin->on('users.id', '=', 'contacts.user_id')
->where('upvote_answers.user_id', '=', 2);
})
->where('questions.question_active', '=', '1')
->where('answers.answer_active', '=', '1')
->selectRaw('answers.answer_content as answer_content,
answers.id as answer_id,
answers.created_at as created_at,
answers.created_at as answer_upvote,
answers.created_at as answer_downvote,
questions.id as question_id,
questions.question_title as question_title,
questions.question_slug as question_slug,
users.id as user_id,
users.name as user_name,
users.user_slug as user_slug,
upvote_answers.upvote as upvote');
echo $yourQuery->toSql(); //generated sql query as string
//dd($yourQuery->get()); //result as collection
结果:
select answers.answer_content as answer_content, answers.id as answer_id, answers.created_at as created_at, answers.created_at as answer_upvote, answers.created_at as answer_downvote, questions.id as question_id, questions.question_title as question_title, questions.question_slug as question_slug, users.id as user_id, users.name as user_name, users.user_slug as user_slug, upvote_answers.upvote as upvote from answers inner join questions on questions.id = answers.question_id inner join users on users.id = answers.user_id left join upvote_answers on users.id = contacts.user_id and upvote_answers.user_id = ? where questions.question_active = ? and answers.answer_active = ?
?
使用后绑定值 ->get()
使用查询生成器,您可以将查询编写为
DB::table('answers as a')
->join('questions as q', 'q.id', '=', 'a.question_id')
->join('users as u', 'u.id', '=', 'a.user_id')
->leftJoin('upvote_answers as ua', function ($join) {
$join->on('ua.answer_id', '=', 'a.id')
->where('ua.user_id', '=', 2);
})
->where('q.question_active', '=', 1)
->where('a.answer_active', '=', 1)
->select(DB::raw('a.answer_content as answer_content,a.id as answer_id,a.created_at as created_at,a.created_at as answer_upvote,a.created_at as answer_downvote,q.id as question_id, q.question_title as question_title, q.question_slug as question_slug, u.id as user_id, u.name as user_name, u.user_slug as user_slug,ua.upvote as upvote'))
->get();