Laravel Красноречивое внутреннее соединение с несколькими условиями


У меня есть вопрос о внутренних соединениях с несколькими значениями 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 является столбцом, а не строкой. Возможно ли это вообще, или я должен исправить это в "где".

Заранее спасибо!

Author: Wouter Neuteboom, 2013-12-22

5 answers

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();
 45
Author: rama, 2013-12-24 17:58:30

Потому что вы сделали это таким образом, что он считает, что оба условия соединения в вашем коде приведены ниже:

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();
 15
Author: The Alpha, 2014-04-30 06:02:08

Вы можете увидеть следующий код для решения проблемы

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'));
});
 15
Author: Majbah Habib, 2016-08-01 09:51:39

Больше с 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;

Надеюсь, это поможет;)

 5
Author: ThangTD, 2016-04-25 10:08:41
//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);
 3
Author: Yagnesh bhalala, 2018-06-16 08:51:55