Abrufen bestimmter Felder in einer hasMany-Beziehung

Lesezeit: 3 Minuten

Tonys Benutzeravatar
Toni

Ich habe ein hat viele Beziehungsfunktion wie folgt:

public function articles()
{
    return $this->hasMany('App\Article');
}

Und benutze es so:

$data = \App\User::with('articles')->get();

Ich habe keine Probleme damit, da es die erwarteten Daten zurückgibt. Etwas wie das:

{
"id": 1,
"name": "Jhon",
"lastname": "Doe",
"articles": [
    {
        "id": 1,
        "title": "Article 1",
        "status": "published",
        "published_at": "2015-04-30"
    },
    {
        "id": 2,
        "title": "Article 2",
        "status": "draft",
        "published_at": null
    }
 ]
}

Was ich versuche zu erreichen, aber ich kann immer noch nicht nur eine Teilmenge der Felder der Beziehung abrufen, um dies zu erhalten:

{
"id": 1,
"name": "Jhon",
"lastname": "Doe",
"articles": [
    {
        "id": 1,
        "title": "Article 1"
    },
    {
        "id": 2,
        "title": "Article 2"
    }
  ]
}

Meine Absicht ist es, einen Weg zu finden, die Teilmenge der Felder in der Funktion des Modells anzugeben, anstatt die zurückgegebene Sammlung zu wiederholen und die unerwünschten Felder aufzuheben.

Ist das möglich?

Benutzeravatar von patricus
Patrikus

Ja es ist möglich. Sie haben ein paar Möglichkeiten.

*NB: Für die Optionen 1 und 2 unten ist der Fremdschlüssel (user_id) ausgewählt werden, damit Laravel beim Aufbau der Beziehungen weiß, wie die Modelle miteinander verknüpft werden.

  1. Ändern Sie die Beziehungsabfrage, wenn Sie sie verwenden. Die with() -Methode kann ein Array von Schlüssel/Wert-Paaren akzeptieren, wobei der Schlüssel der Name der Beziehung und der Wert ein Abschluss ist, der die Beziehungsabfrage ändert.

     $data = \App\User::with(['articles' => function($query) {
         // user_id is required here*
         $query->select(['id', 'title', 'user_id']);
     }])->get();
    
  2. Erstellen Sie eine neue Beziehung, die die gewünschten Felder enthält.

     public function articleTitles() {
         // user_id is required here*
         return $this->hasMany('App\Article')->select(['id', 'title', 'user_id']);
     }
    
     $data = \App\User::with('articleTitles')->get();
    
  3. Wenn Sie nur an der Array/json-Ausgabe interessiert sind, können Sie das App\Article-Modell so ändern, dass nur die ID und der Titel angezeigt werden, wenn sie in ein Array konvertiert werden.

     class Article extends Model {
         protected $visible = ['id', 'title'];
     }
    

Was Sie wählen, hängt davon ab, was Sie brauchen.

  • Ich hatte zuvor Option 2 ohne Erfolg versucht, weil sie in “articles” leer zurückgegeben wurde. Heute habe ich Option 1 ausprobiert und auch leer in “Artikel” zurückgegeben. Ich habe versucht $query->orderBy(‘id’, ‘asc’); und funktioniert, aber mit der “select”-Methode funktioniert es nicht.

    – Toni

    4. Mai 2015 um 11:31 Uhr

  • @Tony Wenn Sie die Optionen 1 oder 2 verwenden, müssen Sie sicherstellen, dass Sie den Fremdschlüssel in die Select-Anweisung (‘id’) aufgenommen haben, sonst weiß Laravel nicht, wie die Objekte miteinander verknüpft werden sollen, und Ihr Artikelattribut wird es immer sein leer.

    – Patrikus

    4. Mai 2015 um 19:01 Uhr

  • Das war das Stück, das es zum Laufen gebracht hat! Nach deinem Kommentar habe ich es so gemacht: return $this->hasMany('App\Article')->select(['id', 'title', 'user_id']); Dieser Foreign_Key war die Antwort. Danke @patricus

    – Toni

    4. Mai 2015 um 22:54 Uhr


  • Ich habe es versucht und warum immer ein leeres Array zurückgeben? eine neue Lösung für Laravel 5.6?

    – Muhammad Dyas Yaskur

    7. September 2018 um 12:42 Uhr

  • @MuhammadDyasYaskur überprüfen Sie die NB “Für die Optionen 1 und 2 oben muss der Fremdschlüssel (user_id) ausgewählt werden, damit Laravel weiß, wie die Modelle beim Aufbau der Beziehungen miteinander verknüpft werden.”

    – parsen

    8. Dezember 2020 um 12:52 Uhr

Benutzeravatar von Jesvin
Jessin

<?php
$data = \App\User::with('articles:id,title,user_id')->get();

user_id ist wichtig bei hat viele Beziehungen

  • Du bist ein Lebensretter, // *user_id ist wichtig in Hasmay-Beziehungen (großartiger Mann). Vielen Dank

    – dipenparmar12

    13. Februar 2020 um 19:05 Uhr

Benutzeravatar von Karim Haddad
Karim Haddad

Ich weiß, dass diese Frage alt ist, aber ich möchte das Problem hervorheben: Wenn Sie bestimmte Felder in der Laravel-Beziehung auswählen möchten, sollten Sie den primary_key in der Auswahl übergeben, um die Daten anstelle von null zu erhalten!

1439770cookie-checkAbrufen bestimmter Felder in einer hasMany-Beziehung

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

Privacy policy