Проблемные отношения многие ко многим на Laravel - PullRequest
0 голосов
/ 04 декабря 2018

Я новичок в 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'));
}

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Большое спасибо, моя проблема была решена.Бывает, что в дополнение к Laravel я использую InfyOM, и это создавало конфликт, когда я пытался вручную добавить записи в сводную таблицу, потому что эта строка уже отвечала за добавление реестра в сводную таблицу: $ dish= $ this-> dishRepository-> create ($ input);

0 голосов
/ 04 декабря 2018

Если вам нужен один тип, чтобы «принадлежать» другому типу несколько раз, и наоборот, то общее отношение «многие ко многим», вероятно, не очень подходит для того, что вы пытаетесь сделать.Не только из-за ограничения первичного ключа, но и потому, что у вас будут случаи, когда для отношения возвращаются результаты с несколькими строками, а отношение «многие ко многим» не будет знать, как их объединить или сгруппировать.Возможно, вы захотите придумать третий тип Model, что-то вроде «атрибута», который имеет отношение к двум другим моделям и помогает вам достичь вашей цели.

...