这是我的帖子表
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id');
$table->integer('category_id')->unsigned()->index();
$table->integer('photo_id')->default(0)->unsigned()->index();
$table->string('title');
$table->text('body');
$table->timestamps();
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
});
}
这是我的用户表
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->integer('role_id')->index()->unsigned()->nullable();
$table->integer('photo_id')->index()->default(0);
$table->boolean('is_active')->default(0);
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
这些是关系
public function posts() {
return $this->hasMany('App\Post');
}
public function user() {
return $this->belongsTo('App\User');
}
删除用户代码
public function destroy($id)
{
$user = User::findOrFail($id);
if($user->photo_id !== 0) {
unlink(public_path() . $user->photo->path);
}
$user->delete();
Session::flash('deleted_user', 'The user has been deleted.');
return redirect('/admin/users');
}
删除帖子的代码
public function destroy($id)
{
$post = Post::findOrFail($id);
if($post->photo_id !== 0) {
unlink(public_path() . $post->photo->path);
}
$post->delete();
return redirect('/admin/posts');
}
我在删除用户时尝试删除与用户相关的所有帖子。 为此,我在posts表中使用外部引用约束,如上所示 但是当我删除用户时它无效。这些帖子仍在那里。 我不知道我做错了什么
答案 0 :(得分:7)
这个问题最有可能发生,因为MySQL实例中的默认表引擎设置为MyISAM,它不支持外键。尝试在MyISAM表上使用外键肯定不会是Laravel中的错误。虽然如果使用外键,Schema Builder可以自动将引擎设置为InnoDB,这样会很好。
所以,在你的架构中使用这一行
$table->engine = 'InnoDB';
或用
更改表格ALTER TABLE table_name ENGINE=InnoDB;
可以帮到你。
答案 1 :(得分:0)
创建自定义方法,例如function destroyAllByUser()
并输入类似
的代码DB::table('posts')->where('user_id', '=', 1)->delete();
我希望它可以提供帮助
答案 2 :(得分:0)
删除用户;
public function destroy($id)
{
$user = User::findOrFail($id);
if($user->photo_id !== 0) {
unlink(public_path() . $user->photo->path);
}
$user->posts->delete();
$user->delete();
Session::flash('deleted_user', 'The user has been deleted.');
return redirect('/admin/users');
}
答案 3 :(得分:0)
另一种解决方法是将laravel-project \ config文件夹下的database.php文件配置为在InnoDB引擎上工作。
'mysql' => [
...
'engine' => 'InnoDB'
]
现在,您在使用外键时无需担心... 记住-如果在创建表之前未配置此设置,则应再次迁移。