【问题标题】:Laravel join and left join together in a queryLaravel join 和 left join 在查询中一起使用
【发布时间】:2018-08-18 22:02:17
【问题描述】:

我有一个 sql 查询,我想将其转换为查询构建器或 Laravel ORM。它工作正常。但我希望它进入查询构建器表单或 ORM。是否可以在查询构建器或 ORM 中编写?

我有四个表格的答案、问题、用户和 upvote_answers。查询有三个“加入”和一个“左加入”,只是为了检查当前登录的用户是否支持(布尔)答案以及其他属性

   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

【问题讨论】:

  • 您可以为每个表创建模型,然后在它们之间创建关系,您不需要加入它们
  • 怎么样,你能告诉我吗?

标签: php laravel eloquent laravel-query-builder


【解决方案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();

您也可以使用左连接子句。

更新:

$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

结果:

选择 answers.answer_content 作为 answer_content,answers.id 作为 answer_id,answers.created_at 作为 created_at,answers.created_at 作为 answer_upvote,answers.created_at 作为 answer_downvote, questions.id 作为 question_id, questions.question_title 作为 question_title, questions.question_slug 作为 question_slug,users.id 作为 user_id, users.name 作为 user_name,users.user_slug 作为 user_slug, upvote_answers.upvote 作为对答案内部连接问题的支持 questions.id = answers.question_id 在 users.id 上内部加入用户 = answers.user_id 在 upvote_answers.answer_id 上加入 upvote_answers = answers.id 在哪里 questions.question_active = ?和 answers.answer_active = ?

如果你需要upvote_answers.user_id = '2'在leftJoin必须使用提前左连接:

->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

结果:

选择 answers.answer_content 作为 answer_content,answers.id 作为 answer_id,answers.created_at 作为 created_at,answers.created_at 作为 answer_upvote,answers.created_at 作为 answer_downvote, questions.id 作为 question_id, questions.question_title 作为 question_title, questions.question_slug 作为 question_slug,users.id 作为 user_id, users.name 作为 user_name,users.user_slug 作为 user_slug, upvote_answers.upvote 作为对答案内部连接问题的支持 questions.id = answers.question_id 在 users.id 上内部加入用户 = answers.user_id 在 users.id 上离开加入 upvote_answers = Contacts.user_id 和 upvote_answers.user_id = ?在哪里 问题.question_active = ?和 answers.answer_active = ?

?值绑定后使用->get()

【讨论】:

  • 我的查询与您的查询不同。
【解决方案2】:

使用查询生成器,您可以将查询编写为

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

【讨论】:

  • 谢谢它的工作,但我不得不写“哪里”而不是“开”。 -where('ua.user_id', '=', 2);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2015-01-10
  • 2013-06-28
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多