php - wherepivot - Laravel Eloquent guardando un objeto con niños
wherepivot laravel (3)
Estoy intentando guardar un order
con order_items
pero realmente no encuentro nada en los documentos que respalden este caso de uso. Una relación hasMany.
Básicamente, hay una tabla de pedidos con algo así como id | user_id y una tabla order_items con id | order_id | ID del Producto.
¿Cómo puedo save()
el pedido y usar una array
de elementos al mismo tiempo sin tener que pasar por encima de los elementos y guardarlos individualmente?
es posible?
Pseudo código suponiendo $items
es una matriz:
$items = Session::get("cart.items");
$order = new Order;
$order->user_id = Auth::user()->id;
$order->order_items = $items;
$order->save();
La respuesta de @jareks ayudó en un escenario similar a excepción de una excepción de asignación masiva . así que al desenterrar documentos encontré que necesita establecer una propiedad protegida o rellenable para la asignación masiva en las últimas versiones de laravel (4.2) .
Por favor remítalo junto con su respuesta.
Propiedades rellenables o protegidas
Cuando creas un nuevo modelo, pasas una serie de atributos al constructor del modelo. Estos atributos se asignan al modelo a través de la asignación masiva. Esto es conveniente; sin embargo, puede ser una preocupación grave de seguridad al pasar ciegamente la entrada del usuario a un modelo. Si la entrada del usuario se pasa ciegamente a un modelo, el usuario puede modificar cualquiera y todos los atributos del modelo. Por esta razón, todos los modelos Eloquent protegen contra la asignación masiva por defecto.
Así que configure las propiedades rellenables o protegidas en su modelo. Documentos y fuente
class User extends Eloquent {
protected $fillable = array(''first_name'', ''last_name'', ''email'');
}
Lo que necesita para una relación de hasMany
es saveMany
o createMany
, dependiendo de lo que createMany
su array $items
:
// array of attributes:
$items = [
[''name''=>''item1'',''price''=>''price1''],
...
];
// then createMany:
$order->orderItems()->createMany($items);
Esto creará nuevas filas en la tabla del Item
s.
// array of models:
$items = [
Item::find($someId),
Item::find($anotherId),
// and/or newly instantiated:
new Item([''name''=>''item1'',''price''=>''price1'']),
...
];
// then createMany:
$order->orderItems()->saveMany($items);
Esto asociará (guardará) los modelos existentes y creará los existentes.
También tenga en cuenta que utilizo camelCase relation name orderItems
lugar de su order_items
. Este es un detalle importante, ya que Eloquent (Laravel v4) busca métodos camelCased en el modelo cuando se trabaja con relaciones (propiedades dinámicas).
//Order model
public function orderItems()
{
return $this->hasMany(...);
}
$order->orderItems; // collection
$order->order_items; // collection as well
// --------------------
// BUT
public function order_items()
{
return $this->hasMany(...);
}
$order->orderItems; // null
$order->order_items; // null
// the only way you can work with relation then, is explicitly use method like:
$order->order_items()->get();
Probablemente no sea la mejor solución que está buscando, pero esto debería funcionar.
Digamos que la matriz se llama $items
, tengo la impresión de que la guardarás en una tabla dinámica. En mi ejemplo a continuación, también tengo un tercer campo en la tabla dinámica item_quantity
llamada item_quantity
.
foreach ($items as $item)
{
$order->items()
->attach($item[''item_id''], [''item_quantity'' => $item[''item_quantity'']]);
}
Básicamente, recorrerás la matriz $items
. Esto supondrá que ha definido la relación en su modelo de pedido llamado items()
.
Luego usa el método attach()
->attach([insert the item_id], array(''3rd field name'' => ''value to be inserted'')
Finalmente, si no tiene un tercer campo en su tabla dinámica, puede hacer
->attach($item_id)
Puede verificar el ejemplo dado en los documentos de Laravel
Nota
attach()
es el método utilizado cuando solo está creando un registro en la base de datos; de lo contrario, necesita un método diferente cuando desea actualizar.