2017-01-18 16 views
2

Ich habe einige redegewandte Modelle mit Beziehungen zueinander, aber ich möchte, dass diese Beziehungen nur dann gesetzt werden, wenn zugehörige Daten vorhanden sind.Laravel Eloquent: Setzen Sie Beziehungen nur, wenn zugehörige Daten vorhanden sind

Zum Beispiel:

  • Department (Modell) -> hasMany -> Arbeiter (Model) (Relation nur gesetzt werden, wenn die Abteilung der Arbeitnehmer liegen, sonst nicht gesetzt) ​​

Ist es möglich? Ich habe versucht, diese und gescheiterte horrably: (in Abteilung Modell)

public function worker() { 

    $model = new Department(); 

    if(isset($model->relations)) { 
     return $this->hasMany(Worker::class, 'wrk_department_id'); 
     } 
    } 

// EDIT:

Wenn Abteilung keine Arbeiter hat meine Ausgabe ist wie:

{ 
"data": { 
    "type": "department", 
    "id": "8", 
    "attributes": { 
     "accessory": [], 
     "department": "Marketing", 
     "department_id": 8, 
     "dept_floor_id": 2, 
     "inventory": [], 
     "software": [], 
     "worker": [] 
    }, 
    "links": { 
     "self": { 
      "href": "http://127.0.0.1:8000/api/v2/department/8" 
     } 
    } 
}, 
"links": { 
    "self": { 
     "href": "http://127.0.0.1:8000/api/v2/department/8" 
    } 
}, 
"jsonapi": { 
    "version": "1.0" 
} 

}

Wenn Abteilung hat Arbeiter, alles funktioniert wie erwartet:

{ 
"data": { 
"type": "department", 
"id": "1", 
"attributes": { 
    "department": "Entwicklung", 
    "department_id": 1, 
    "dept_floor_id": 3 
}, 
"links": { 
    "self": { 
    "href": "http://127.0.0.1:8000/api/v2/department/1" 
    } 
}, 
"relationships": { 
    "worker": { 
    "data": [ 
     { 
     "type": "worker", 
     "id": "5" 
     }, 
     { 
     "type": "worker", 
     "id": "8" 
     }, 
     { 
     "type": "worker", 
     "id": "11" 
     }, 
     { 
     "type": "worker", 
     "id": "13" 
     }, //and so on 

Ich versuche, die leeren Felder, um loszuwerden, (zB .: „Arbeiter“: []), die erscheinen, wenn ihre

+0

Was möchten Sie erreichen? Holen Sie nur Abteilungen mit Arbeitern oder etwas anderes? –

+0

bearbeitet den Beitrag –

+0

Ihre Ausgabe wird von der Abfrage, die Sie verwenden, verwaltet. Nicht nach dem, was Sie in Ihrem 'Modell' definieren. – Gayan

Antwort

1

In Department Modell die Beziehung hinzufügen.

public function worker() { 
    return $this->hasMany(Worker::class, 'wrk_department_id'); 
} 

Und wenn Sie Abfrage in dir method in your-controller.

$builder = Department::with('other-relationships'); 
If('your-condition-check') { 
    $builder-with('workers'); 
} 
$model = $builder->get(); 

Dies ist das Konzept. Verwenden Sie den entsprechenden Code für Ihr Szenario.

+0

Vielen Dank für Ihre Antwort! Es funktioniert :) –

+0

Froh, dass Sie es hilfreich finden. Schätzen Sie es, wenn Sie es als akzeptiert und nach oben stimme :) – Gayan

+0

Ich markierte es als akzeptiert. aber leider kann ich wegen mangelnder rufpunkte nicht upvoten, sorry :( –

0

Fügen Sie einfach die Beziehung keine verwandten Daten und die Sammlung filtern auf nur diejenigen Arbeiter enthalten, wie folgt:

$departments = Department::with('workers')->filter(function($department) { 
     return ! is_null($department->workers) 
    }); 

Auf diese Weise haben Sie nur die Abteilungen, die mindestens einen Arbeiter enthalten.

+0

Danke! Funktioniert perfekt, genau wie die Lösung, die Gayan zur Verfügung gestellt hat –

Verwandte Themen