2016-04-17 33 views
1

Ich spiele immer noch mit Laravel herum. Im Moment möchte ich die Abfrageaktivität "minimieren". Gibt es eine Möglichkeit, die dynamische Eigenschaft einer Beziehung automatisch zu aktualisieren (Sorry, ich weiß nicht, wie ich sie nennen soll)? Ich denke, die folgende Blindkode hilft, meine Frage zu verstehen :) http://laravel.io/bin/mG0QqLaravel Eloquent - Dynamische Eigenschaft

Class User extends Model { 



    public function posts() 
    { 
     return $this->hasMany(Post::class); 
    } 
} 

$user = User::fetchSomeUser(); 
$post = Post::createSomeNewPost(); 


var_dump($user->posts); // Gives me all the posts which where attached to the user BEFORE i loaded the model from the DB 

$user->posts()->attach($post); // or save? 

var_dump($user->posts); 
// Generates the same output as above. The new attached post is not fetched 
// by this dynamic property. Is there a way to get the new post into this dynamic property 
// WITHOUT reloading the hole data from the DB? 

Ich würde mich sehr freuen, wenn mir jemand ein paar Tipps geben könnte :) Danke Jungs!

Antwort

2

Unter hasOne/hasMany rufen Sie save() über die Beziehung. Auf belongsTo, rufen Sie attach() auf die Beziehung und dann save() die Eltern.

// hasOne/hasMany 
$user->posts()->save($post); 

// belongsTo 
$post->user()->attach($user); 
$post->save(); 

Was den Rest Ihrer Frage, lesen Sie bitte die Diskussion auf this github issue dafür, warum müssen Sie die Beziehung neu zu laden. Die Grundidee ist, dass Ihre Beziehung zusätzliche where Einschränkungen oder order Klauseln haben könnte. Daher können Sie den neu verknüpften Datensatz nicht einfach zu der geladenen Beziehungsauflistung hinzufügen, da es keinen einfachen Weg gibt, um zu bestimmen, ob dieser Datensatz sogar in die Sammlung gehört oder wohin in der Sammlung er gehen soll.

Wenn Sie sicherstellen möchten, dass Ihr Beziehungsattribut den neu verknüpften Datensatz enthält, müssen Sie die Beziehung erneut laden.

// first call to $user->posts lazy loads data 
var_dump($user->posts); 

// add a newly related post record 
$user->posts()->save($post); 

// reload the relationship 
$user->load('posts'); 

// if the newly related record match all the conditions for the relationship, 
// it will show up in the reloaded relationship attribute. 
var_dump($user->posts); 
+0

Vielen Dank für die schnelle Antwort! Es macht Sinn und ich verstehe das Problem. Würde dir gerne einen Dump geben, aber ich habe nicht genug Ruf;) edit: Es ist seltsam, dass der $ user-> load ('posts') auch nicht wirklich funktioniert. Aber ich habe nicht genug Zeit, um es endlich zu testen – Leichti