SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row:
保存具有多对多关系(组和成员)的模型时出现此错误。
SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行:外键约束失败(propulse
.group_user
,CONSTRAINT group_user_group_id_foreign
外键 (group_id
) 引用 groups
(id
) 删除级联
有时在向关系 table 中插入值时:
SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行:外键约束失败(propulse
.group_user
,CONSTRAINT group_user_group_id_foreign
FOREIGN KEY (group_id
) 引用 groups
(id
) ], user_id
) 值 (1, 4), (2, 4), (3, 4))
请注意,列是颠倒的 (group_id
, user_id
)
在此示例中,值 4 应用于列 group_id
这是我的代码:
User.php
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'username',
'email',
'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function groups() {
return $this->belongsToMany(
Group::class,
'group_user',
'group_id',
'user_id'
);
}
public function propulsedGroups() {
return $this->hasMany(Group::class);
}
}
Group.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Group extends Model
{
use HasFactory;
protected $table = 'groups';
protected $fillable = [
'logo',
'name',
'description',
'propulser_id'
];
public function users() {
return $this->belongsToMany(
User::class,
'group_user',
'user_id',
'group_id'
);
}
public function propulser() {
return $this->belongsTo(User::class, 'propulser_id');
}
}
users_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id')->unsigned();
$table->string('username')->unique();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->string('code')->unique();
$table->enum('status', ['active', 'blocked', 'desactivated']);
$table->enum('type', ['member', 'propulser'])->default('member');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
groups_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateGroupsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('groups', function (Blueprint $table) {
$table->increments('id')->unsigned();
$table->string('name');
$table->longText('description');
$table->string('logo')->nullable();
//$table->string('cover')->nullable();
$table->string('code')->unique();
$table->integer('propulser_id')->unsigned();
$table->foreign('propulser_id')->references('id')->on('users')
->onUpdate('cascade')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('groups');
}
}
group_user_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class GroupUser extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('group_user', function (Blueprint $table)
{
$table->increments('id')->unsigned();
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')
->onUpdate('cascade')->onDelete('cascade');
$table->integer('group_id')->unsigned();
$table->foreign('group_id')->references('id')->on('groups')
->onUpdate('cascade')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('group_user');
}
}
GroupsController.php函数存储()
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required',
'description' => 'required',
'logo' => validate_image(),
'propulser_id' => '',
'members' => ''
], [], [
'name' => 'Name',
'description' => 'Description',
'logo' => 'Logo',
'propulser_id' => 'Propulser',
'members' => 'members'
]);
$letter = chr(rand(65,90));
$code = IdGenerator::generate(['table' => 'users', 'field' => 'code', 'length' => 10, 'prefix' => $letter]);
$group = new Group;
$group->code = $code;
$group->name = $request->name;
$group->description = $request->description;
$group->propulser_id = $request->propulser_id;
if (request()->hasFile('logo')) {
$group->logo = Up::upload([
'new_name' => 'group',
'file' => 'logo',
'path' => 'groups',
'upload_type' => 'single',
'delete_file' => Group::find($request->id) != null ? Group::find($request->id)->logo : ''
]);
}
$user = User::find($request->propulser_id);
$user->type = "propulser";
$user->save();
$group->save();
$group->users()->attach($request->members);
session()->flash('success', 'Added successfully');
return redirect(aurl('groups'));
}
创建群组视图:
<section id="create-group">
<div class="card">
<div class="card-header"><i class="fa fa-align-justify"></i> {!! $title !!}</div>
<div class="card-body">
{!! Form::open(['url' => aurl('groups'), 'files' => true]) !!}
<div class="form-group">
<div class="avatar-upload">
<div class="avatar-edit">
{!! Form::file('logo', ['class'=>'form-control', 'id' => 'imageUpload']) !!}
<label for="imageUpload"><i class="fas fa-pencil-alt"></i></label>
</div>
<div class="avatar-preview">
<div id="imagePreview" style="background-image: url(http://i.pravatar.cc/500?img=7);">
</div>
</div>
</div>
</div>
<div class="form-group">
{!! Form::label('name', 'Group name') !!}
{!! Form::text('name', old('name'), ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('description', 'Group description') !!}
{!! Form::textarea('description', old('description'), ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('propulser_id_id', 'propulser') !!}
{!! Form::select('propulser_id', $users, old('propulser_id'),['class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('members', 'Members') !!}
{!! Form::select('members[]', $users, old('members'),['multiple' => 'multiple','class' => 'js-example-basic-multiple form-control']) !!}
</div>
{!! Form::submit('Create', ['class' => 'btn btn-primary']) !!}
{!! Form::close() !!}
</div>
</div>
</section>
我希望有人能提供帮助。
提前致谢。
我修好了。
问题是我应该在 user_id 模型 之前制作 group_id Group.php
return $this->belongsToMany(
User::class,
'group_user',
'group_id'
'user_id',
);
}```
在我的例子中,我将 group_id 类型更改为 'string'。将 属性 添加到组模型中,例如:
public $incrementing = false;
protected $keyType = 'string';
保存具有多对多关系(组和成员)的模型时出现此错误。
SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行:外键约束失败(propulse
.group_user
,CONSTRAINT group_user_group_id_foreign
外键 (group_id
) 引用 groups
(id
) 删除级联
有时在向关系 table 中插入值时:
SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行:外键约束失败(propulse
.group_user
,CONSTRAINT group_user_group_id_foreign
FOREIGN KEY (group_id
) 引用 groups
(id
) ], user_id
) 值 (1, 4), (2, 4), (3, 4))
请注意,列是颠倒的 (group_id
, user_id
)
在此示例中,值 4 应用于列 group_id
这是我的代码: User.php
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'username',
'email',
'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
public function groups() {
return $this->belongsToMany(
Group::class,
'group_user',
'group_id',
'user_id'
);
}
public function propulsedGroups() {
return $this->hasMany(Group::class);
}
}
Group.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Group extends Model
{
use HasFactory;
protected $table = 'groups';
protected $fillable = [
'logo',
'name',
'description',
'propulser_id'
];
public function users() {
return $this->belongsToMany(
User::class,
'group_user',
'user_id',
'group_id'
);
}
public function propulser() {
return $this->belongsTo(User::class, 'propulser_id');
}
}
users_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id')->unsigned();
$table->string('username')->unique();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->string('code')->unique();
$table->enum('status', ['active', 'blocked', 'desactivated']);
$table->enum('type', ['member', 'propulser'])->default('member');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
groups_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateGroupsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('groups', function (Blueprint $table) {
$table->increments('id')->unsigned();
$table->string('name');
$table->longText('description');
$table->string('logo')->nullable();
//$table->string('cover')->nullable();
$table->string('code')->unique();
$table->integer('propulser_id')->unsigned();
$table->foreign('propulser_id')->references('id')->on('users')
->onUpdate('cascade')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('groups');
}
}
group_user_table
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class GroupUser extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('group_user', function (Blueprint $table)
{
$table->increments('id')->unsigned();
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')
->onUpdate('cascade')->onDelete('cascade');
$table->integer('group_id')->unsigned();
$table->foreign('group_id')->references('id')->on('groups')
->onUpdate('cascade')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('group_user');
}
}
GroupsController.php函数存储()
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required',
'description' => 'required',
'logo' => validate_image(),
'propulser_id' => '',
'members' => ''
], [], [
'name' => 'Name',
'description' => 'Description',
'logo' => 'Logo',
'propulser_id' => 'Propulser',
'members' => 'members'
]);
$letter = chr(rand(65,90));
$code = IdGenerator::generate(['table' => 'users', 'field' => 'code', 'length' => 10, 'prefix' => $letter]);
$group = new Group;
$group->code = $code;
$group->name = $request->name;
$group->description = $request->description;
$group->propulser_id = $request->propulser_id;
if (request()->hasFile('logo')) {
$group->logo = Up::upload([
'new_name' => 'group',
'file' => 'logo',
'path' => 'groups',
'upload_type' => 'single',
'delete_file' => Group::find($request->id) != null ? Group::find($request->id)->logo : ''
]);
}
$user = User::find($request->propulser_id);
$user->type = "propulser";
$user->save();
$group->save();
$group->users()->attach($request->members);
session()->flash('success', 'Added successfully');
return redirect(aurl('groups'));
}
创建群组视图:
<section id="create-group">
<div class="card">
<div class="card-header"><i class="fa fa-align-justify"></i> {!! $title !!}</div>
<div class="card-body">
{!! Form::open(['url' => aurl('groups'), 'files' => true]) !!}
<div class="form-group">
<div class="avatar-upload">
<div class="avatar-edit">
{!! Form::file('logo', ['class'=>'form-control', 'id' => 'imageUpload']) !!}
<label for="imageUpload"><i class="fas fa-pencil-alt"></i></label>
</div>
<div class="avatar-preview">
<div id="imagePreview" style="background-image: url(http://i.pravatar.cc/500?img=7);">
</div>
</div>
</div>
</div>
<div class="form-group">
{!! Form::label('name', 'Group name') !!}
{!! Form::text('name', old('name'), ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('description', 'Group description') !!}
{!! Form::textarea('description', old('description'), ['class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('propulser_id_id', 'propulser') !!}
{!! Form::select('propulser_id', $users, old('propulser_id'),['class' => 'form-control']) !!}
</div>
<div class="form-group">
{!! Form::label('members', 'Members') !!}
{!! Form::select('members[]', $users, old('members'),['multiple' => 'multiple','class' => 'js-example-basic-multiple form-control']) !!}
</div>
{!! Form::submit('Create', ['class' => 'btn btn-primary']) !!}
{!! Form::close() !!}
</div>
</div>
</section>
我希望有人能提供帮助。 提前致谢。
我修好了。
问题是我应该在 user_id 模型 之前制作 group_id Group.php
return $this->belongsToMany(
User::class,
'group_user',
'group_id'
'user_id',
);
}```
在我的例子中,我将 group_id 类型更改为 'string'。将 属性 添加到组模型中,例如:
public $incrementing = false;
protected $keyType = 'string';