trucos tips que puede porque hacer espaƱol ejemplos con abm laravel laravel-4 eloquent relationship

que - tips laravel



Relaciones elocuentes: adjuntar(pero no guardar) a Has Many (3)

Tengo las siguientes relaciones establecidas:

class Page { public function comments() { return $this->hasMany(''Comment''); } } class Comment { public function page() { return $this->belongsTo(''Page''); } }

Estándar bastante bog. Una página puede tener muchos comentarios y un comentario pertenece a una sola página.

Me gustaría poder crear una nueva página:

$page = new Page;

y un comentario

$comment = new Comment;

y adjuntar el comentario a la página, sin guardar nada de ello.

$page->comments->associate($comment);

He intentado lo siguiente:

// 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

Lo realmente extraño es que hacer lo contrario (adjuntar la página al comentario) funciona correctamente:

$comment->page()->associate($page);

Los documentos relevantes están here pero no hacen ninguna mención de adjuntar el lado UNO de uno a muchos. ¿Es incluso posible? (Siento que debería ser)


De acuerdo con Benubird, solo quería agregar algo mientras me tropecé con esto hoy:

Puede llamar al método de agregar en una colección como Benubird declaró. Para considerar las preocupaciones de edpaaz (consulta adicional), hice esto:

$collection = $page->comments()->getEager(); // Will return the eager collection $collection->add($comment) // Add comment to collection

Por lo que puedo ver, esto evitará la consulta adicional ya que solo usamos el objeto de relación.

En mi caso, una de las entidades fue persistente, mientras que la primera (en su página de caso) no fue (y será creada). Como tenía que procesar algunas cosas y quería manejar esto de manera objetiva, quería agregar un objeto de entidad persistente a un no persistente. Debería funcionar con ambos no persistentes, también.

Gracias Benubird por indicarme la dirección correcta. Espero que mi adición ayude a alguien como lo hizo por mí.

Tenga en cuenta que esta es mi primera publicación de , así que deje sus comentarios con un poco de preocupación.


No se puede hacer ya que no hay IDs para enlazar.

Así que primero necesita guardar el padre ( $page ) y luego guardar el modelo hijo:

// $page is existing model, $comment don''t need to be $page->comments()->save($comment); // saves the comment

O al revés, esta vez sin guardar:

// again $page exists, $comment don''t need to $comment->page()->associate($page); // doesn''t save the comment yet $comment->save();


Parece que solo desea agregar el nuevo objeto de comentario a la colección de comentarios de la página; puede hacerlo fácilmente, utilizando el método de adición de la colección básica:

$page = new Page; $comment = new Comment; $page->comments->add($comment);