Des relations éloquentes - attachez (mais ne sauvez pas) à Has Many
J'ai la suite de relations mis en place:
class Page {
public function comments() {
return $this->hasMany('Comment');
}
}
class Comment {
public function page() {
return $this->belongsTo('Page');
}
}
Assez tourbière de la norme. Une page peut avoir de nombreux commentaires, et un commentaire appartient à une seule page.
Je voudrais être en mesure de créer une nouvelle page:
$page = new Page;
et un commentaire
$comment = new Comment;
et fixez le commentaire de la page, sans sauvegarder il
$page->comments->associate($comment);
J'ai essayé ce qui suit:
//These are for one-to-many from the MANY side (eg. $comment->page->associate...)
$page->comments->associate($comment); //Call to undefined method Illuminate\Database\Eloquent\Collection::associate()
$page->comments()->associate($comment); //Call to undefined method Illuminate\Database\Query\Builder::associate()
//These 2 are for many-to-many relations, so don't work
$page->comments->attach($comment); //Call to undefined method Illuminate\Database\Eloquent\Collection::attach()
$page->comments()->attach($comment); //Call to undefined method Illuminate\Database\Query\Builder::attach()
//These 2 will (if successful) save to the DB, which I don't want
$page->comments->save($comment); //Call to undefined method Illuminate\Database\Eloquent\Collection::save()
$page->comments()->save($comment); //Integrity constraint violation: 1048 Column 'page_id' cannot be null
Vraiment curieux, c'est que faire le contraire (fixation de la page pour le commentaire) fonctionne correctement:
$comment->page()->associate($page);
Pertinentes docs sont ici mais elles ne font pas mention de l'attacher à un côté de l'un-à-plusieurs. Est-il même possible? (J'ai l'impression que ça devrait être)
source d'informationauteur Joe
Vous devez vous connecter pour publier un commentaire.
Il semble que vous voulez juste ajouter l'objet de commentaire de la page de commentaires de la collection, vous pouvez le faire facilement, à l'aide de la base colection méthode add:
Vous ne pouvez pas le faire car il n'y a pas d'id en lien.
Donc, vous devez d'abord enregistrer le parent (
$page
) puis enregistrez le modèle de l'enfant:ou dans l'autre sens, cette fois sans enregistrement:
selon Benubird je voulais juste ajouter quelque chose que je suis tombé sur cela aujourd'hui:
Vous pouvez appeler la méthode add sur une collection telle que Benubird déclaré.
Pour prendre en compte les préoccupations de edpaaz (supplémentaire tiré de la requête) j'ai fait ceci:
Aussi loin que je peux voir cela permettra d'éviter la requête supplémentaire que nous n'utilisons que la relation d'objet.
Dans mon cas, l'une des entités persistantes, tandis que le premier (dans votre cas la page) n'a pas été (et être créé). Comme j'ai eu à traiter un peu les choses et je voulais les traiter dans un objet manière, je voulais ajouter une entité persistante objet d'une non permanent. Doit travailler avec les deux non persistant, trop bien.
Merci Benubird pour m'indiquer la bonne direction. J'espère que mon plus aide à quelqu'un comme il l'a fait pour moi.
Veuillez avoir à l'esprit que c'est ma première stackoverflow post, donc merci de laisser vos commentaires avec un peu d'inquiétude.