2017-06-20 4 views
0

Wenn ich versuche, Modellbeziehungen in JSON zurückzugeben, werden die Beziehungsfelder nicht angezeigt. Das ist meine Frage:Laravel gibt Modellbeziehungen in JSON zurück

$customer_subscriptions = CustomerSubscription::has("customer") 
       ->has("subscription") 
       ->has("federationDiscipline") 
       ->where("customer_id", "=", $customer_id) 
       ->whereHas("subscription", function($query) use($company_id) { 
        $query->where("company_id", "=", $company_id); 
       }) 
       ->orderBy("start_date", "asc"); 

     return $customer_subscriptions; 

Das ist mein Ergebnis ist:

[0]=> 
    array(14) { 
    ["id"]=> 
    int(2) 
    ["customer_id"]=> 
    int(1) 
    ["subscription_id"]=> 
    int(1) 
    ["federation_discipline_id"]=> 
    int(1) 
    ["start_date"]=> 
    string(10) "2017-04-01" 
    ["end_date"]=> 
    string(10) "2017-05-31" 
    ["external_id"]=> 
    NULL 
    ["notes"]=> 
    NULL 
    ["created_user_id"]=> 
    int(1) 
    ["updated_user_id"]=> 
    NULL 
    ["deleted_user_id"]=> 
    NULL 
    ["created_at"]=> 
    string(19) "2017-06-05 07:28:00" 
    ["updated_at"]=> 
    string(19) "2017-06-05 07:28:00" 
    ["deleted_at"]=> 
    NULL 
    } 

ich nicht das Abonnement sehen und das Beziehungsfeld des Kunden. Das Ergebnis der Abfrage sollte JSON an AJAX zurückgeben

Antwort

2

Die Verwendung von ->has wirkt nur als eine Where-Bedingung, es lädt diese Relation nicht in Ihre Ergebnismenge.

Sie möchten stattdessen ->with verwenden.

In Ihrem Fall ->with('subscription','federationDiscipline')

https://laravel.com/docs/5.4/eloquent-relationships#eager-loading

+0

Ok es funktioniert. Aber wenn ich mit benutze, könnte das Model auch den CustomerSubscription ohne Kunde/Subscription/FederationDiscipline bekommen. Kann ich mit beiden verwenden? – Mintendo

+0

Ja, Sie können beide verwenden. –

2

Verwenden Sie die with() Methode Beziehungen in den Ergebnissen enthalten. Zum Beispiel:

$customer_subscriptions = CustomerSubscription::with("customer")->... 

Alternativ können Sie das protected $appends = [...] Attribut auf Modelle, die die Beziehung zwingen, für jede Abfrage geladen werden. Bedenken Sie jedoch, dass dies Auswirkungen auf Abfragen hat, an denen das Modell verwendet wird, da es die Datenbank zwingt, diese Beziehungen jedes Mal abzufragen.

+0

Ok, es funktioniert. Aber wenn ich mit benutze, könnte das Model auch den CustomerSubscription ohne Kunde/Subscription/FederationDiscipline bekommen. Kann ich mit beiden verwenden? – Mintendo

+0

Sie können sicherlich beide verwenden, jedoch würde ich die Abfrage zu 'Customer :: with (" subscription ") ändern -> ...' da Sie nach einem bestimmten Kunden suchen. Sie müssen die Pivot-Tabelle nicht direkt abfragen. – btl

0

Sie müssen eager load die Beziehungen für sie in der JSON-Ausgabe enthalten sein. Ihre aktuelle Abfrage sucht nur, ob es Beziehungen gibt, sie werden nicht geladen.

Zum Beispiel:

$customer_subscriptions = CustomerSubscription::has("customer") 
    ->has("subscription") 
    ->has("federationDiscipline") 
    ->where("customer_id", "=", $customer_id) 
    ->whereHas("subscription", function($query) use($company_id) { 
     $query->where("company_id", "=", $company_id); 
    }) 
    ->orderBy("start_date", "asc") 
    ->with('customer'); // <--- Eager loading the customer 

return $customer_subscriptions; 

    return $customer_subscriptions; 
Verwandte Themen