with wherepivot updateorcreate meaning hasmany example php laravel eloquent

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.