2013-12-22 44 views
22

我有一个关于多个连接内部连接的问题值。 我确实在laravel中构建了这样的代码。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是列,而不是一个字符串。这甚至是可能的,还是我必须解决它在哪里。

在此先感谢!

+0

原来我不得不使用DB :: raw(); $ join-> on('kg_shops.active','=',DB :: raw(“1”)); –

回答

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

因为你这样做是在这样一种方式,它认为两者都加入如下代码中的条件:

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

嗨谢赫,谢谢你的答案,但我试过。给我以下结果。 PHP致命错误:调用未定义的方法Illuminate \ Database \ Query \ JoinClause ::行35上的/app/models/Feeds.php中的哪里() –

+1

更新您的laravel版本 – thedjaney

+0

如何添加多个具有OR条件的连接?像加入这个或加入ON? – Saani

3

更多与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; 

希望它有帮助;)

+0

而不是使用'array_map',你可以这样做:'$ linkIds = $ links-> lists('id','id')'同样,如果你有使用'hasMany()'和'pivot()'的雄辩模型效果很好太。 – ash

+0

确定非常感谢您的建议,我还没有发现它很长时间:( – ThangTD

+0

有时候事情可能没有记录,但我倾向于在[Github]上查看源代码(https://github.com/laravel/framework /tree/5.2/src/Illuminate)或[API文档](https://laravel.com/api/5.2/) – ash

8

你可以看到下面的代码来解决这个问题

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')); 
}); 
+0

如果我打印查询日志,那么它显示两者之间的条件。但我怎样才能用'或'代替'AND' –

+1

使用它。 $ join-> orOn('kg_shops.active','=',DB :: raw('1')); –