Laravel Eloquent unión interna con múltiples condiciones

4 minutos de lectura

avatar de usuario
Neuteboom de Wouter

Tengo una pregunta sobre las uniones internas con múltiples valores. Construí mi código así en 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"));

    });
}

El único problema es que da este resultado:

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

Como puede ver, las múltiples condiciones en la combinación funcionan bien, pero piensa que el 1 es una columna en lugar de una cadena. ¿Es esto posible, o tengo que arreglarlo en el dónde?

¡Gracias por adelantado!

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

  • Puede agregar la cláusula where dentro de la unión, tan elocuente que pensará que “1” no es una columna, como dice Kamlesh.

    – Ricard Espinàs Llovet

    28 de mayo de 2021 a las 9:33


Puedes ver el siguiente código para resolver el problema.

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

O otra forma de solucionarlo

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

  • Si estoy imprimiendo el registro de consultas, entonces se muestra AND entre ambas condiciones. Pero como puedo usar or en vez de AND

    – er.irfankhan11

    9 de junio de 2017 a las 6:38

  • úsalo $join->orOn(‘kg_shops.active’,’=’, DB::raw(‘1’));

    – Mabah Habib

    11 de junio de 2017 a las 9:34


  • Si el campo ‘activo’ contiene una cadena, debe usar DB::raw(“‘YES'”) en lugar de DB::raw(‘YES’).

    – Anees Sadeek

    15 de agosto de 2019 a las 7:34

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

avatar de usuario
el alfa

Porque lo hizo de tal manera que piensa que ambas son condiciones de unión en su código que se muestra a continuación:

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");
    });
}

Por lo tanto, debe eliminar la segunda línea:

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

Ahora, debe agregar una cláusula where y debería ser así:

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

Simplemente puede agregar múltiples condiciones agregándolas como where () dentro del cierre de unión

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

más con 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;

Espero que sea útil 😉

avatar de usuario
sin coque

Esto no es politicamente correcto pero funciona

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad