问题关系在Laravel上多对多

时间:2018-12-04 20:33:39

标签: laravel many-to-many relationship

我是Laravel新手,遇到了这个问题: 我有2个表,柏拉图和配料,它们之间存在多对多的关系,为此,我使用了第三个表,称为compositiones_platos。

为了保存多对多关系,我尝试使用以下方法:

$ platos-> ingredientes()-> attach($ input ['ingredientes']);

但是会出现以下错误:

SQLSTATE [23000]:违反完整性约束:1062项“ PRIMARY”的重复项“ 151-3”(SQL:插入到ingredientes_platosplatos_idingredientes_id,{{ 1}})值(151、3,))

稍微看一下文档,我可以使用同步而不是附加来解决,但这不能解决我的问题,因为除了保存关系的ID之外,我还需要在数据透视表中保存其他属性。

请务必注意,如果我尝试将这些数据保存到Ingredients_platos以外的其他表中,那么无论使用哪种方法,我都不会遇到此问题,并且可以正确保存数据。

感谢您的关注,希望您能对我有所帮助。

这是三个表的模型:

Table Platos:

norma_bruta

}

表成分:

public $ table ='ingredientes';

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

}

表的成分表:

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

}

Platos Controller:

public $table = 'ingredientes_platos';

public $fillable = [
    'platos_id',
    'ingredientes_id',
    'norma_bruta',
    'norma_neta',
    'unidad_id'
];

public $timestamps = false;

3 个答案:

答案 0 :(得分:0)

如果您需要一种类型多次“属于”另一种类型,反之亦然,那么通用的多对多关系可能不适合您尝试做的事情。不仅由于主键约束,还因为您将遇到为该关系返回多行结果的情况,而多对多关系将不知道如何汇总或分组这些关系。您可能想提出第三种Model,类似于“属性”,它与其他两种模型有关系并可以帮助您实现目标。

答案 1 :(得分:0)

非常感谢,我的问题已经解决。碰巧,除了Laravel,我还使用InfyOM,当我尝试将记录手动添加到数据透视表时,这造成了冲突,因为该行已经负责将注册表添加到数据透视表: = $ this-> dishRepository-> create($ input);

答案 2 :(得分:0)

// Many to Many relationship in category Model to Post model coding here
namespace App;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
        public function posts()
    {
        return $this->belongsToMany('App\Post')->withTimestamps();
    }
}

// Many to Many relationship in Post Model to Category model coding here

namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{

    public function categories(){
return $this->belongsToMany('App\Category')->withTimestamps();
 }




}