Связать таблицы с laravel
я хочу связать две таблицы и сохранить два идентификатора в другой таблице, чтобы связать их, например:
я вошел в систему с пользователем, и я создаю продукт, например, добавляю идентификатор пользователя и идентификатор продукта в дополнительную таблицу, если продукт еще не создан, и у меня нет его идентификатора? Без использования метода добавления +1 к последнему идентификатору продукта, так как это может привести к конфликту, если несколько пользователей создают продукты.
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
}
}
Готово, у вас уже есть отношения.