Я новичок в Laravel, у меня возникла эта проблема: у меня есть 2 таблицы, плато и ингредиенты, они имеют отношение многие ко многим, и для этого я использую третью таблицу, называемую ингридиенты_платосы.
Чтобы сохранить отношение многих ко многим, я попытался использовать следующее:
$ platos-> ингридиенты () -> прикрепить ($ input ['ингридиенты']);
, но это даетследующая ошибка:
SQLSTATE [23000]: нарушение ограничения целостности: 1062 Повторяющаяся запись '151-3' для ключа 'PRIMARY' (SQL: вставить в ingredientes_platos
(platos_id
, ingredientes_id
, norma_bruta
) значения (151, 3,))
Глядя немного в документации, я мог бы решить с синхронизацией вместо присоединения, но это не решает мою проблему, потому что в дополнение к сохранению идентификаторов отношенийМне нужно сохранить другие атрибуты в сводной таблице.
Важно отметить, что если я пытаюсь сохранить эти данные в таблице, отличной от ингридиентов_платосов, я не получаю эту проблему, и данные сохраняются правильно, нетнезависимо от того, какой метод я использую.
Я ценю ваше внимание, надеюсь, вы мне поможете.
Это модели для трех столов:
Стол Платос:
public $table = 'platos';
protected $dates = ['deleted_at'];
public $fillable = [
'Grupo',
'Nombre',
'Procedimiento',
'Cantidad',
'Unidad',
'Precio'
];
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'Grupo' => 'integer',
'Nombre' => 'string',
'Procedimiento' => 'string',
'Cantidad' => 'integer',
'Unidad' => 'integer',
'Precio' => 'double'
];
/**
* Validation rules
*
* @var array
*/
public static $rules = [
'Grupo' => 'required',
'Nombre' => 'required'
];
public function ingredientes()
{
return $this->belongsToMany(Ingredientes::class);
}
public function grupo_platos()
{
return $this->hasOne('App\Models\Grupo_Platos', 'id', 'Grupo');
}
}
Таблица Ingredientes:
public $ table = 'ингридиенты';
protected $dates = ['deleted_at'];
public $fillable = [
'Grupo',
'Nombre',
'Descripcion',
'Kcal',
'Proteinas',
'Grasas',
'Unidad',
'Precio'
];
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'Grupo' => 'integer',
'Nombre' => 'string',
'Descripcion' => 'string',
'Kcal' => 'double',
'Proteinas' => 'double',
'Grasas' => 'double',
'Unidad' => 'integer',
'Precio' => 'double'
];
/**
* Validation rules
*
* @var array
*/
public static $rules = [
'Nombre' => 'required'
];
public function platos()
{
return $this->belongsToMany(Platos::class);
}
}
Таблица Ingredientes_Platos:
public $table = 'ingredientes_platos';
public $fillable = [
'platos_id',
'ingredientes_id',
'norma_bruta',
'norma_neta',
'unidad_id'
];
public $timestamps = false;
}
Контроллер Platos:
public function store(CreatePlatosRequest $request)
{
$input = $request->all();
$platos = $this->platosRepository->create($input);
$id = $platos->id;
$ingredientes = $input['ingredientes'];
$norma_b = $input['norma_b'];
$t = sizeof($ingredientes);
$i=0;
for ($i = 0; $i < $t; $i++) {
$pivot = new Ingredientes_Platos;
$pivot->platos_id = $platos['id'];
$pivot->ingredientes_id = $ingredientes[$i];
$pivot->norma_bruta = $norma_b[$i];
$pivot->save();
}
Flash::success('Plato agregado correctamente.');
return redirect(route('platos.index'));
}