Relacionar tablas con laravel

publicado por: Anonymous

Quiero relacionar dos tablas, y guardar los dos id en otra tabla para relacionarlos, por ejemplo:

Estoy logeado con un usuario, y creo un producto, como añado el id del usuario y el id del producto en una tabla adicional si aún no se ha creado el producto y no tengo su id? Sin utilizar el metodo de sumarle +1 al ultimo id del producto ya que puede dar conflicto si hay mas de un usuario creando productos.

solución

Respuesta corta no puedes hacer lo que dices, debes primero crear el producto, después de eso es sencillo relacionarlos, la opción más viable es crear primero la migración correspondiente, te recomiendo seguir las convenciones de Laravel.


Asumiendo que tus dos tablas sean users y productos en tu línea de comandos crea una migración php artisan make:migration create_producto_user_table.

En tu migración:

Schema::create('producto_user', function (Blueprint $table) {
    $table->integer('producto_id')->unsigned();
    $table->integer('user_id')->unsigned();

    $table->foreign('producto_id')->references('id')->on('productos')
                ->onUpdate('cascade')->onDelete('cascade');
    $table->foreign('user_id')->references('id')->on('users')
                ->onUpdate('cascade')->onDelete('cascade');

    $table->primary(['producto_id', 'user_id']);
});

Asegurate que en las migraciones tanto users como productos el id sea incrementable, si creas la migración por medio de un comando artisan ya aparecerá automáticamente, si no agrega al inicio de la migración $table->increments('id'); debe quedar más o menos así:

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    //Las demás tablas
...
Schema::create('productos', function (Blueprint $table) {
    $table->increments('id');
    //Las demás tablas
...

En tus modelos:

class User extends Authenticatable
{
...
    public function productos()
    {
     return $this->belongsToMany(Producto::class);
    }

//

class Producto extends Model
{
...
    public function usuarios()
        {
         return $this->belongsToMany(User::class);
        }

En el controller de tu elección en el cual vayas a crear el producto y asociarlo al user:

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use AppProducto;

class MainController extends Controller
{
    public function ejemplo(Request $request)
    {
        $producto = new Producto;
        $producto->nombre = $request->nombre;
        ... #Y todos los datos recabados con tu form.
        $producto->save();

        //Al momento de pasar la función save() a la variable $producto 
        //se guardan los datos en la DB y te retorna el id
        //de esa forma puedes pasarle el id a la tabla intermedia

        //Asumo que el user que creo el producto será el actualmente logeado
        $user = Auth::user(); //De no ser así aquí haces el query para encontrar el user
        $user->productos()->attach($producto->id);
        //Aquí agregaste el id del producto 
        //y se asume el id del usuario para guardar 
       //ambos en la tabla intermedia

    }
}

Listo, ya tienes la relación.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *