Laravel Eloquent Inner Join mit mehreren Bedingungen

Lesezeit: 3 Minuten

Benutzer-Avatar
Wouter Neueboom

Ich habe eine Frage zu Inner Joins mit mehreren On-Werten. Ich habe meinen Code so in Laravel erstellt.

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

    });
}

Das einzige Problem ist, es gibt dieses Ergebnis:

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

Wie Sie sehen können, gehen die mehreren Bedingungen in der Verknüpfung gut, aber es denkt, dass die 1 ist eine Spalte anstelle eines Strings. Ist das überhaupt möglich, oder muss ich das wo beheben.

Danke im Voraus!

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

  • Sie können die where-Klausel innerhalb des Joins hinzufügen, so eloquent, dass es denkt, dass “1” keine Spalte ist, wie Kamlesh sagt.

    – Ricard Espinàs Llovet

    28. Mai 2021 um 9:33 Uhr


Sie können den folgenden Code sehen, um das Problem zu lösen

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

Oder eine andere Möglichkeit, es zu lösen

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

  • Wenn ich das Abfrageprotokoll drucke, wird es angezeigt AND zwischen beiden Zuständen. Aber wie kann ich verwenden or Anstatt von AND

    – er.irfankhan11

    9. Juni 2017 um 6:38 Uhr

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

    – Majbah Habib

    11. Juni 2017 um 9:34 Uhr


  • Wenn das ‘active’-Feld einen String enthält, müssen Sie DB::raw(“‘YES'”) anstelle von DB::raw(‘YES’) verwenden.

    – Anees Sadeek

    15. August 2019 um 7:34 Uhr

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

Benutzer-Avatar
Das Alpha

Weil Sie es so gemacht haben, dass beide in Ihrem unten angegebenen Code Join-Bedingungen sind:

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

Sie sollten also die zweite Zeile entfernen:

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

Jetzt sollten Sie eine where-Klausel hinzufügen, die so aussehen sollte:

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

Sie können einfach mehrere Bedingungen hinzufügen, indem Sie sie als where() innerhalb des Join-Abschlusses hinzufügen

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

Mehr mit 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;

Hoffe es hilft 😉

Benutzer-Avatar
Entkoken

Das ist politisch nicht korrekt, funktioniert aber

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

1344850cookie-checkLaravel Eloquent Inner Join mit mehreren Bedingungen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy