Portál AbcLinuxu, 4. května 2025 00:50

Dotaz: Laravel - razeni podle vnorenych vztahu

31.5.2024 16:02 Petr
Laravel - razeni podle vnorenych vztahu
Přečteno: 613×
Odpovědět | Admin
Dobry den,

mam nasledujici modely:
Country hasMany cities()
City    hasMany streets()
Street  hasMany houses()

House  belongsTo street()
Street belongsTo city()
City   belongsTo country()
A ted se snazim do modelu Country pridat metodu houses(), ktera mi vrati pole vsech House modelu v dane Country.

Dopracoval jsem se k tomuto:
public function houses(): Builder
{
    $houses = House::whereHas('street', function($query) {
        $query->whereHas('city', function($query) {
            $query->where('cities.country_id', $this->id);
        });
    });
    
    return $houses;
}
Coz mi sice funguje, ale za boha nejsem schopny prijit na to, jak ty vracene modely nejprve seradit podle cities.name, potom podle streets.name a nakonec podle houses.number

Dekuji za pripadnou pomoc

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

31.5.2024 16:17 Petr
Rozbalit Rozbalit vše Re: Laravel - razeni podle vnorenych vztahu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ja se picnu! Vzdycky se mi rozsviti, az kdyz se zeptam.

Takze reseni je napr. toto:
public function houses(): Builder
{
    $houses = House::leftJoin('streets', function($join) {
        $join->on('houses.street_id', 'streets.id')->leftJoin('cities', function($join) {
            $join->on('streets.city_id', 'cities.id')->where('cities.country_id', $this->id);
        });
    })
    ->orderBy('cities.name')
    ->orderBy('streets.name')
    ->orderBy('houses.number');
    return $houses;
}
Omlouvam se, za zbytecny dotaz.
31.5.2024 16:30 Petr
Rozbalit Rozbalit vše Re: Laravel - razeni podle vnorenych vztahu
Takhle je to mozna jeste lepsi (vzhledem k vyslednemu SQL dotazu):
public function houses(): Builder
{
    $houses = House::leftJoin('streets', function($join) {
        $join->on('houses.street_id', 'streets.id');
    })
    ->leftJoin('cities', function($join) {
        $join->on('streets.city_id', 'cities.id');
    })
    ->where('cities.country_id', $this->id)
    ->orderBy('cities.name')
    ->orderBy('streets.name')
    ->orderBy('houses.number');
    
    return $houses;
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.