Joa*_*oas 6 laravel eloquent laravel-5
我有一个 Tournament 模型,其中包含与 Session 模型的belongsToMany 关系:
class Tournament extends Model{
public function sessions(){
return $this->belongsToMany(Session::class, 'tournament_has_sessions');
}
}
Run Code Online (Sandbox Code Playgroud)
然后我的会话模型包含与用户模型的belongsToMany 关系:
class Session extends Model{
public function users(){
return $this->belongsToMany(User::class, 'session_has_users');
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我删除锦标赛时,我想用它删除 session_has_users 表中的所有会话和所有信息。
我试过了:
$tournament->sessions()->with('users')->delete(); -- < This
$tournament->sessions()->delete();
$tournament->users()->detach();
$tournament->delete();
Run Code Online (Sandbox Code Playgroud)
但它不起作用。session_has_users 表中的数据持久化
我意识到我可以做这样的事情:
DB::table('session_has_users')->whereIn('session_id', $this->sessions()->pluck('id'))->delete();
Run Code Online (Sandbox Code Playgroud)
但是有没有更有效/更方便(或者即使不是更有效的替代方法)来实现这一目标?
Dev*_*von 16
对外键使用 RDBMS 引用操作
在数据库模式中,您应该使用操作定义外键ON DELETE CASCADE。这将在删除引用的 id 时自动删除相关记录。
(有关 Laravel 迁移文件中的示例行,请参阅 dbudimir 的回答)
使用 Eloquent 分离所有相关模型
如果您不使用外键或您的数据库缺乏对引用操作的支持,您可以使用:
$tourament->sessions()->sync([]);
Run Code Online (Sandbox Code Playgroud)
同步方法接受要放置在中间表上的一组 ID。任何不在给定数组中的 ID 都将从中间表中删除。因此,此操作完成后,中间表中将只存在给定数组中的 ID:
https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships
提供一个空数组应该删除所有关系。
小智 7
在表 'tournament_has_sessions' 中,您可以像这样设置 onDelete('cascade')
$table->integer('tournament_id')->unsigned()->nullable();
$table->foreign('tournament_id')->references('id')->on('tournaments')->onDelete('cascade');
$table->integer('session_id')->unsigned()->nullable();
$table->foreign('session_id')->references('id')->on('sessions')->onDelete('cascade');
Run Code Online (Sandbox Code Playgroud)
并且当delete锦标赛自动删除该表中的所有记录
您可以使用其中任何一个:
$tourament->sessions()->detach();
或者
$tourament->sessions()->sync([]);
或者您可以使用 ON DELETE CASCADE 定义外键,如上面的答案
| 归档时间: |
|
| 查看次数: |
12488 次 |
| 最近记录: |