Grundsätzliches zu Models

  • Hallöchen,


    wenn ich auf ein Model zugreife, also z.B.


    Code
    $flight = App\Flight::where('number', 'FR 900')->first();


    Wird dann jedes mal ein neuer Query gestartet oder nur ein mal?


    Genau jetzt wo ich die Frage stelle, finde ich folgendes:


    Code
    $freshFlight = $flight->fresh();


    Heißt das, dass die Daten einmal pro Seitenaufruf in das Model geladen werden und dann die Daten aus dem Speicher aufrufe? Wenn ich jetzt erst was aus der DB lade, dann was schreibe und möchte danach auf die aktuellen Daten zugreifen, dann muss ich nach dem Schreiben "fresh" verwenden? Habe ich das richtig verstanden?

    Gruß Sven aka BigRib


    Laravel und Vue Anfänger

    PHP, HTML, CSS, JQuery -> Wissen vorhanden, aber sehr Hobbymäßig

  • Ich frage deswegen. Ich benötige alle Artikel die bei einer Bestellung bestellt wurden. Ich habe nun 3 Tabellen:


    1. Orders -> ich brauche alles mit dem order_status 1,2,202

    2. orders_products -> da benötige ich alle produkte mit den orders_ids, die ich aus "orders" ausgelesen haben.

    3. orders_products_properties -> da benötige ich alle von den Produkten, die ich aus der Order Products ausgelesen habe.


    Bisher habe ich das so gelöst:


    Ich lese erst die orders aus und lasse mir einen String erzeugen, mit dem ich dann mit WHERE IN alle orders_products auslese. Bei dem auslesen der orders_products lasse ich mir dann wieder einen string erzeugen, mit dem ich dann die properties über WHERE IN auslese.


    Das ganze kann ich natürlich ohne Models in Laravel auch machen, aber ich glaube das hier Raum für Optimierungen sind.


    Meine Überlegung war, das ich die Orders auslese und in der Schleife der Orders dann die Produkte als dem orders_products Model auslese und hier wiederum eine Schleife mache, die mir zu den Produkten die properties ausliest. Das ganze geht natürlich nur, wenn ich nicht erneut jedes Mal ein Query erzeuge.


    Hier mal meine bisherige Version (nicht Laravel)


    Vielen Dank schonmal :D

    Gruß Sven aka BigRib


    Laravel und Vue Anfänger

    PHP, HTML, CSS, JQuery -> Wissen vorhanden, aber sehr Hobbymäßig

  • Okay ich bin schon etwas weiter, aber noch nicht glücklich ;D


    Ich habe nun 3 Modelle angelegt


    Code
    class Order extends Model
    {
    protected $primaryKey = 'orders_id';
    public function orderProducts()
    {
    return $this->hasMany(OrderProduct::class, 'orders_id', 'orders_id');
    }
    }
    Code
    class OrderProductProperty extends Model
    {
    protected $table = 'orders_products_properties';
    protected $primaryKey = 'orders_products_properties_id';
    public function orderProduct()
    {
    return $this->belongsTo(OrderProduct::class, 'orders_products_id', 'orders_products_id');
    }
    }

    Leider habe ich noch keine Möglichkeit gefunden, wie ich die Daten elegant in ein Multi-Array bekomme.


    Die relevanten Bestellungen bekomme ich nun hiermit:

    Code
    $orders = Order::select('orders_id', 'customers_name')->whereIn('orders_status', ['1', '2', '202'])->get();

    Über eine Schleife kann ich auch auf die anderen Daten zugreifen, aber da fliegen mir die Queries nur so um die Ohren:

    Code
    foreach ($orders as $data) {
    $op[] = $data->orderProducts;
    foreach ($data->orderProducts as $dataOpp) {
    $opp[] = $dataOpp->orderProductProperties;
    }
    }

    Gruß Sven aka BigRib


    Laravel und Vue Anfänger

    PHP, HTML, CSS, JQuery -> Wissen vorhanden, aber sehr Hobbymäßig

  • Hey BigRib :)
    Also grundsätzlich wird eine Funktion aufgerufen wenn diese in einem GET Parameter steht, wenn die URL aufgerufen wird.
    Je nach Deinen Cachingeinstellungen kann die Seite natürlich mit Inhalt gespeichert werden und dann nicht erneut aufgerufen werden.

    Ob das Sinn macht kommt auf das Projekt an


    Viele Grüße

    Ben

  • Hallo Ben,


    Danke für Deine Antwort.


    Ich habe nun folgende Datenbankabfrage:


    Kann man sowas mittels eines Model Eloquent lösen? Ich bekomme es nicht hin, da die Ausgabe eindimensional ist.


    Als ausgabe bekomme ich also mehrere "orders", für die orders gibt es mehrere orders_products und hierfür gibt es wiederum mehrere "orders_products_properties"


    Mit der Abfrage oben lasse ich mir dann ein mehrdimensionales Array erstellen.


    Code
    foreach ($orders as $key => $value) {
    $ordersArray[$value->orders_id]['orders_id'] = $value->orders_id;
    $ordersArray[$value->orders_id]['customers_name'] = $value->customers_name;
    $ordersArray[$value->orders_id]['products'][$value->orders_products_id]['orders_products_id'] = $value->orders_products_id;
    $ordersArray[$value->orders_id]['products'][$value->orders_products_id]['products_name'] = $value->products_name;
    $ordersArray[$value->orders_id]['products'][$value->orders_products_id]['products_model'] = $value->products_model;
    $ordersArray[$value->orders_id]['products'][$value->orders_products_id]['products_properties'][$value->properties_name] = $value->values_name;
    }

    Gruß Sven aka BigRib


    Laravel und Vue Anfänger

    PHP, HTML, CSS, JQuery -> Wissen vorhanden, aber sehr Hobbymäßig

    Einmal editiert, zuletzt von BigRib ()

  • Ich weiß nicht warum, aber nun habe ichs doch hinbekommen.

    Code
    public function getOrdersTest()
    {
    $orders = Order::select('orders_id', 'customers_name')->whereIn('orders_status', [2])->get();
    return view(
    'test2',
    [
    'ordersArray' => $orders
    ]
    );
    }

    Gruß Sven aka BigRib


    Laravel und Vue Anfänger

    PHP, HTML, CSS, JQuery -> Wissen vorhanden, aber sehr Hobbymäßig

  • So nun hab ichs ein bisschen getestet.


    Die Version mit den 3 Modellen aus dem Beitrag #3 in Verbindung mit dem Controller und den Foreachs aus #6 hat 37 DB Querys und die Version im Beitrag #5 hat nur einen DB Query und lädt deutlich schneller.

    Gruß Sven aka BigRib


    Laravel und Vue Anfänger

    PHP, HTML, CSS, JQuery -> Wissen vorhanden, aber sehr Hobbymäßig