Связать таблицы с laravel


я хочу связать две таблицы и сохранить два идентификатора в другой таблице, чтобы связать их, например:

я вошел в систему с пользователем, и я создаю продукт, например, добавляю идентификатор пользователя и идентификатор продукта в дополнительную таблицу, если продукт еще не создан, и у меня нет его идентификатора? Без использования метода добавления +1 к последнему идентификатору продукта, так как это может привести к конфликту, если несколько пользователей создают продукты.

Author: Shaz, 2017-09-19

1 answers

Короткий ответ вы не можете делать то, что говорите, вы должны сначала создать продукт, после этого легко связать их, наиболее жизнеспособным вариантом является сначала создать соответствующую миграцию, я рекомендую следовать соглашениям Laravel.


Предполагая, что ваши две таблицы users и productos в вашей командной строке создают миграцию php artisan make:migration create_producto_user_table.

В вашей миграции:

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']);
});

Убедитесь, что в миграциях как users, так и productos id incrementable, если вы создаете миграцию с помощью команды artisan, она уже появится автоматически, если вы не добавите к началу миграции $table->increments('id'); она должна выглядеть примерно так:

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

В ваших моделях:

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

//

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

В controller по вашему выбору, в котором вы создаете продукт и связываете его с user:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Producto;

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

    }
}

Готово, у вас уже есть отношения.

 2
Author: David Garaekz, 2017-09-19 17:31:12