【问题标题】:Laravel Eloquent inner join with multiple conditions具有多个条件的 Laravel Eloquent 内部连接
【发布时间】:2014-01-10 23:13:18
【问题描述】:

我有一个关于具有多个 on 值的内部联接的问题。 我确实在 laravel 中构建了这样的代码。

public function scopeShops($query) {
    return $query->join('kg_shops', function($join)
    {
        $join->on('kg_shops.id', '=', 'kg_feeds.shop_id');
        // $join->on('kg_shops.active', '=', "1"); // WRONG
        // EDITED ON 28-04-2014
        $join->on('kg_shops.active', '=', DB::raw("1"));

    });
}

唯一的问题是,它给出了这样的结果:

Column not found: 1054 Unknown column '1' in 'on clause' (SQL: select `kg_feeds`.* from `kg_feeds` inner join `kg_shops` on `kg_shops`.`id` = `kg_  
  feeds`.`shop_id` and `kg_shops`.`active` = `1`) (Bindings: array (                                                                                        )) 

如您所见,连接中的多个条件运行良好,但它认为1 是一列而不是字符串。这甚至可能吗,还是我必须在哪里修复它。

提前致谢!

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    这在政治上不正确,但有效

       ->leftJoin("players as p","n.item_id", "=", DB::raw("p.id_player and n.type='player'"))
    

    【讨论】:

      【解决方案2】:

      您可以通过在连接闭包中将它们添加为 where() 来简单地添加多个条件

      ->leftJoin('table2 AS b', function($join){
              $join->on('a.field1', '=', 'b.field2')
              ->where('b.field3', '=', true)
              ->where('b.field4', '=', '1');
      })
      

      【讨论】:

        【解决方案3】:
        //You may use this example. Might be help you...
        
        $user = User::select("users.*","items.id as itemId","jobs.id as jobId")
                ->join("items","items.user_id","=","users.id")
                ->join("jobs",function($join){
                    $join->on("jobs.user_id","=","users.id")
                        ->on("jobs.item_id","=","items.id");
                })
                ->get();
        print_r($user);
        

        【讨论】:

          【解决方案4】:

          可以看下面的代码解决问题

          return $query->join('kg_shops', function($join)
          {
              $join->on('kg_shops.id', '=', 'kg_feeds.shop_id');
              $join->where('kg_shops.active','=', 1);
          });
          

          或者其他解决方法

           return $query->join('kg_shops', function($join)
          {
              $join->on('kg_shops.id', '=', 'kg_feeds.shop_id');
              $join->on('kg_shops.active','=', DB::raw('1'));
          });
          

          【讨论】:

          • 如果我正在打印查询日志,那么它会在两个条件之间显示AND。但是我如何使用or 而不是AND
          • 使用它。 $join->orOn('kg_shops.active','=', DB::raw('1'));
          • 如果 'active' 字段包含字符串,则必须使用 DB::raw("'YES'") 而不是 DB::raw('YES')。
          【解决方案5】:

          更多 where in (list_of_items):

              $linkIds = $user->links()->pluck('id')->toArray();
          
              $tags = Tag::query()
                  ->join('link_tag', function (JoinClause $join) use ($linkIds) {
                      $joinClause = $join->on('tags.id', '=', 'link_tag.tag_id');
                      $joinClause->on('link_tag.link_id', 'in', $linkIds ?: [-1], 'and', true);
                  })
                  ->groupBy('link_tag.tag_id')
                  ->get();
          
              return $tags;
          

          希望对您有所帮助;)

          【讨论】:

          • 不使用array_map,您可以这样做:$linkIds = $links->lists('id', 'id') 此外,如果您有使用hasMany()pivot() 的雄辩模型也可以很好地工作。
          • 好的,非常感谢你的建议,我好久没找到了:(
          • 有时可能没有记录,但我倾向于查看GithubAPI documentation 上的源代码
          • :我也是,我会尽量减少这样不必要的代码,实际上我浪费了时间去挖掘像你给的那样的函数,但是相当 :(
          • 只是pluck的别名,用过get就不行了;所以在你的情况下$linkIds = $user->links()->pluck('id')
          【解决方案6】:

          因为您这样做的方式是它认为两者都是下面给出的代码中的连接条件:

          public function scopeShops($query) {
              return $query->join('kg_shops', function($join)
              {
                  $join->on('kg_shops.id', '=', 'kg_feeds.shop_id');
                  $join->on('kg_shops.active', '=', "1");
              });
          }
          

          所以,你应该删除第二行:

          return $query->join('kg_shops', function($join)
          {
              $join->on('kg_shops.id', '=', 'kg_feeds.shop_id');
          });
          

          现在,你应该添加一个 where 子句,它应该是这样的:

          return $query->join('kg_shops', function($join)
          {
            $join->on('kg_shops.id', '=', 'kg_feeds.shop_id')->where('kg_shops.active', 1);
          })->get();
          

          【讨论】:

          • 嗨,Sheikh,谢谢你的回答,但我试过了。给我以下结果。 PHP 致命错误:在第 35 行的 /app/models/Feeds.php 中调用未定义的方法 Illuminate\Database\Query\JoinClause::where()
          • 如何使用 OR 条件添加多个联接?喜欢加入这个还是加入那个?
          • $join->on()->orOn().
          【解决方案7】:
          return $query->join('kg_shops', function($join)
           {
             $join->on('kg_shops.id', '=', 'kg_feeds.shop_id');
          
           })
           ->select('required column names') 
           ->where('kg_shops.active', 1)
           ->get();
          

          【讨论】:

          • 你可以在join里面添加where子句,所以雄辩的它会认为“1”不是一个列,就像Kamlesh说的那样。
          猜你喜欢
          • 1970-01-01
          • 2022-01-15
          • 2017-08-25
          • 2012-05-12
          • 2018-04-12
          • 2018-10-05
          • 1970-01-01
          • 2016-07-22
          • 1970-01-01
          相关资源
          最近更新 更多