Laravel Eloquent内部联接有多种条件

Wou*_*oom 45 php laravel eloquent

我有一个关于内部联接的问题,有多个值.我在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"));

    });
}
Run Code Online (Sandbox Code Playgroud)

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

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 (                                                                                        )) 
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,连接中的多个条件都可以,但它认为它1是一列而不是字符串.这甚至可能,或者我必须在哪里修复它.

提前致谢!

小智 57

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();
Run Code Online (Sandbox Code Playgroud)


Maj*_*bib 31

您可以看到以下代码来解决问题

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

或者另一种解决方法

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

  • 用它。$join->orOn('kg_shops.active','=', DB::raw('1')); (2认同)

The*_*pha 17

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

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");
    });
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Yag*_*ala 12

//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);
Run Code Online (Sandbox Code Playgroud)


Kam*_*esh 9

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

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


Tha*_*gTD 8

更多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;
Run Code Online (Sandbox Code Playgroud)

希望它有用;)


Unc*_*oke 6

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

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