model insert laravel primary-key eloquent

model - laravel: ejemplo elocuente insertar datos en la base de datos



primary-key eloquent (1)

Bueno, he vuelto a leer tu pregunta y creo que tienes algunas cosas mal, así que en lugar de dejar más comentarios en la publicación principal, pensé que podría intentar una respuesta, así que aquí va.

En primer lugar, su relación es del tipo equivocado y de la manera incorrecta. Como lo entiendo (y al implementar estas cosas en mi propio trabajo), un producto pertenece a una marca: una marca puede tener varios productos, pero un producto solo puede tener una marca. Entonces, primero su esquema de base de datos: usted menciona que tiene una tabla de products con las columnas normales y luego la clave externa brand_id . Hasta ahora, bien: esto es consistente con la forma en que interpreto la relación.

Sin embargo, luego vas a mostrarnos tu modelo. Tiene el modelo del producto como marca hasOne , pero en realidad pertenece a una marca. Tampoco define la inversa de la relación, necesita que ambas partes hagan que Laravel funcione bien. Además, sus nombres están un poco fuera de lugar, posiblemente funcionará, pero si seguimos las convenciones de Laravel obtenemos lo siguiente:

En el modelo de products : Product.php

class Product extends Eloquent { public function brand() { return $this->belongsTo(''Brand''); } }

Ahora el modelo de las brands : Brand.php

class Brand extends Eloquent { public function products() { return $this->hasMany(''Product''); } }

Bueno hasta ahora todo bien. Notarás varias convenciones:

  1. Los nombres de las tablas son plurales ( products , brands ).
  2. Las claves foráneas usan el singular ( brand_id )
  3. Los nombres de los modelos son singulares y StudlyCase (por lo tanto, Product para Product de mesa, Brand para brands mesa)
  4. La propiedad $table no tiene que especificarse siempre y cuando sigas las convenciones de Laravel (es decir, el nombre de la tabla es la versión plural de snake_case del modelo classname
  5. Debe definir la relación en ambos sentidos (uno en cada modelo, el inverso de hasMany es hasMany , también están los pares hasOne / belongsTo y belongsToMany / belongsToMany )
  6. Los nombres de los métodos para recuperar la relación son sensatos: si espera un resultado, conviértalo en singular ( brand en Product ), si espera que varios resultados lo conviertan en plural ( products en Brand )
  7. Use los nombres de los modelos en sus definiciones de relaciones ( $this->hasMany(''Brand'') no $this->hasMany(''brands'') o cualquier otra variación

Si sigues estas reglas, tus modelos pueden ser muy concisos pero muy poderosos.

Ahora, en cuanto a cómo define realmente los datos reales, tengo la sensación de que el código que publicó puede funcionar bien (realmente depende de qué tan inteligente esté Laravel detrás de la escena), pero como sugerí en mi primer comentario, me aseguraría de que Guardé la $brand antes de llamar a associate() , solo para que Laravel no se pierda y descubra qué hacer. Como tal me gustaría ir por:

// create new brand and save it $brand = new Brand; $brand->name = "Brand 1"; $brand->save(); // create new product and save it $product = new Product; $product->name = "Product 1"; $product->description = "Description 1"; $product->brand()->associate($brand); $product->save();

De esta manera, usted sabe que tiene la marca en la base de datos con sus ID ya definidos antes de ir y usarla en una relación.

También puede definir la relación de la manera opuesta, y puede ser menos doloroso hacerlo:

// create new product and save it $product = new Product; $product->name = "Product 1"; $product->description = "Description 1"; $product->save(); // create new brand and save it $brand = new Brand; $brand->name = "Brand 1"; $brand->save(); // now add the product to the brand''s list of products it owns $brand->products()->save($product);

No es necesario llamar a save() en ninguno de los modelos después de la última línea, ya que tomará automáticamente el valor de id $brand , lo colocará en el campo brand_id $product y luego guardará el $product .

Para obtener más información, consulte los documentos sobre cómo realizar esta relación insertando: http://laravel.com/docs/eloquent#one-to-many

De todos modos, espero que esta publicación aclare una buena cantidad de lo que estaba mal con tu código. Como dije anteriormente, estas son convenciones, y puedes ir en contra de ellas, pero para hacerlo tienes que comenzar a introducir código adicional, y puede ser bastante ilegible para otros desarrolladores. Digo que si eliges un marco dado, también puedes seguir sus convenciones.

Lamento preguntar esto, pero vengo de CodeIgniter y me cuesta mucho entender la inserción elocuente del modelo. Esta es una nueva forma de trabajar con modelos para mí.

He leído este artículo y entiendo algunos conceptos básicos ahora.

Tengo el siguiente ejemplo. Tengo un producto que tiene muchos atributos, pero el más relevante es la marca y el nombre del producto. (ver las siguientes tablas de ejemplo)

productos: id (PK), nombre, descripción, marcas brand_id: id (PK), nombre

Ahora viene el problema. Sé que puedo crear una nueva marca y sé cómo puedo crear un nuevo producto. Sin embargo no tengo qlue cómo conectar los dos juntos. Aquí hay un código que tengo ahora. Quiero crear un nuevo producto y llenar automáticamente la tabla de marcas. Esta es una parte del controlador en este momento.

En breve. Quiero las marcas.id dentro de los productos.brand_id

$product = new Products; $product->name = "product1"; $product->description = "description1"; $brand = new Brands; $brand->name = "brand1" $product->brand()->associate($brand); $brand->save(); $product->save();

Para que quede más claro. Tengo 2 modelos. Modelos de productos y marcas. Sin embargo, no me queda claro lo que debería estar en el modelo. Este es mi modelo de productos actual. Creo que el modelo de marcas solo debería tener una $ table = "marcas" protegida; línea dentro de la clase modelo.

class Products extends Eloquent { protected $table = ''products''; public function brand() { return $this->hasOne(''brands''); } }

¿Puede alguien explicarme lo que hago mal? No puedo encontrar un buen tutorial sobre cómo trabajar con la inserción de datos dentro de modelos elocuentes con relaciones. La mayoría de los tutoriales son sobre la visualización de datos.