0

I gesetzt haben 2 Modelle (Post und Kategorie) mit Es ist die richtige Beziehungen konfiguriertModell kehrt relation's dynamische Attribute aber null Beziehung

class Post extends Model 
{ 
    protected $fillable = [ 
     'title', 
     'excerpt', 
     'body', 
     'featured', 
     'published', 
     'category_id', 
    ]; 

    public function category() 
    { 
     return $this->belongsTo('App\Category'); 
    } 
} 

class Category extends Model 
{ 
    protected $fillable = [ 
     'name', 
    ]; 

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

Und mein Post's Speicherverfahren ist

public function store(Request $request) 
{ 
    $post = Post::create($request->all()); 
    return redirect('admin/posts'); 
} 

Die Sache ist, es funktioniert tatsächlich ok, es setzt die category_id auf den Tisch und ich kann alle dynamischen Daten mit Hilfe von $post->category->name holen, aber wenn ich var_dump($post->relation) bekomme ich eine null zurück.

I wenn Sie ein neues Post-Modell erstellen, alle Attribute festlegen, speichern und dann das Kategoriemodell (wie im offiziellen Kanal dokumentiert) zuordnen, wird alles wie erwartet zurückgegeben.

Für jetzt alles, was ich brauche, ist es, seine dynamischen Attribute zu holen, und es funktioniert jetzt gut, aber ich weiß, dass ich etwas falsch machen muss, um die Null-Antwort zu bekommen. Meine Sorge ist, dass es jetzt gut funktionieren könnte, aber wenn das Projekt größer wird, werde ich wahrscheinlich ein größeres Problem haben und ich werde viel Arbeit haben, um dieses Problem zu beheben.

+1

Sie meinen 'var_dump ($ post-> category)'? – alepeino

+0

Nein, ich meinte wirklich 'dd ($ post-> kategorie-> name);'. Ich bekomme, was man so erwartet, nämlich den Kategorienamen der Post. –

Antwort

0

Die Beziehung ist nicht da, weil Sie es nicht geladen haben. Alles, was es weiß, ist der Fremdschlüssel. Es wäre sehr ineffizient, wenn es all diese Informationen für dich erfassen würde, weil es nicht immer alles benötigt. Denken Sie an Instanzen, in denen ein einzelnes Modell viele Beziehungen haben könnte, das wären viele Datenbankaufrufe ohne Grund.

Wenn Sie die Beziehung benötigen, können Sie verwenden. Da die Beziehung noch nicht geladen ist, wird sie für Sie bereitgestellt, wenn Sie dies tun.

Oder Sie können es eifrig laden, indem Sie die folgenden $post->load('category') verwenden, obwohl dies nicht wirklich von Vorteil ist, weil Sie mit einem einzigen Post zu diesem Zeitpunkt arbeiten. Wenn Sie eine Sammlung von Post Objekten hätten, würden Sie anfangen, die Vorteile der Verwendung von $posts->load('category') zu sehen, andernfalls enden Sie mit dem n + 1 Problem. Wenn Sie also $post->load('category') und dann var_dump($post) verwenden, sollten Sie feststellen, dass die Beziehung nicht länger null ist.

+0

Also, im Grunde ist es besser, das Foreign nur zu setzen, anstatt die Modelle zu assoziieren, wenn ich nicht viel von Sammlungen und nur ein paar Attributen verwende, wie in diesem Fall? Meine Anwendung ist ein Multisite-CMS, ich denke, ich werde so viele Seiten haben, wo ich nur einen Beitrag anzeigen werde und es ist die Kategorie als Seiten, wo alle Beiträge aufgelistet sind. Was würden Sie mir vorschlagen? –

+0

Ich würde sagen, in diesem Fall ist es besser, nur den Fremdschlüssel zu setzen. Andernfalls müssen Sie ein neues "Post" -Modell mit den festgelegten Attributen instanziieren, nach der 'Category' suchen und dann Ihre' Category' mit Ihrer 'Post' verknüpfen, was letztendlich zu mehr Abfragen als nötig führen würde. – user3158900

+0

Awsome, danke! –