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?
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.
-
Ä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();
-
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();
-
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.
<?php
$data = \App\User::with('articles:id,title,user_id')->get();
user_id
ist wichtig bei hat viele Beziehungen
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!