我正在构建一个小型应用程序,以测试Laravel 7中的多对多关系。该应用程序与项目和用户(多对多)有关。
经过身份验证的用户可以创建新项目。每个项目都有自己的页面。在项目页面上,将显示一个列表,其中列出了该项目成员的每个用户的名称,并且在每个名称旁边是一个按钮,应从该项目中删除特定的用户/成员。
现在,我被困在“删除用户”功能上。我不明白如何获取列表中每个用户的ID,并将其传递给将“分离”多对多关系的函数。
我的文件在下面:
迁移:
Users_Table:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->boolean('is_admin')->nullable();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
Projects_Table:
public function up()
{
Schema::create('projects', function (Blueprint $table) {
//primary key
$table->bigIncrements('id');
//foreign keys columns
$table->unsignedBigInteger('user_id');
//normal table columns
$table->string('title')->unique();
//created_at and updated_at columns
$table->timestamps();
//add constraints
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
});
}
Project_Users_Table(数据透视):
public function up()
{
Schema::create('project_user', function (Blueprint $table) {
$table->foreignId('project_id')->constrained();
$table->foreignId('user_id')->constrained();
$table->timestamps();
});
}
模型:
User.php:
public function projects()
{
return $this->belongsToMany('App\Project');
}
Project.php:
protected $fillable = ['name'];
public function members()
{
return $this->belongsToMany('App\User');
}
public function creator()
{
return $this->belongsTo('App\User', 'user_id', 'id');
}
查看:
<ul>
@foreach($project->members as $member)
<li>{{$member->name}}
<!-- if connected user is admin, show "remove user" button -->
@if ( Auth::user()->is_admin == 1 )
<form class="delete_project_form" method="POST" action="{{url('/projects/'.$project->id.'/remove_user/'.$member->id)}}">
@csrf
@method('DELETE')
<button type="submit" value="Delete">Remove</button>
</form>
@endif
</li>
@endforeach
</ul>
路线:
web.php:
Route::delete('/projects/{project}/remove_user/{member}', 'ProjectController@remove_user');
控制器:
ProjectController.php:
public function remove_user(Project $project)
{
$user_id = $project->members()->id;
$project->members()->detach($user_id);
return redirect('/projects/'.$project->id);
}
我知道这显然是不正确的,但是使用此配置,它会产生以下错误:
未定义的属性: 照亮\ Database \ Eloquent \ Relations \ BelongsToMany :: $ id
http:// localhost / rel_test / public / projects / 6 / remove_user / 2
你们能帮忙吗?预先谢谢你
答案 0 :(得分:1)
尝试一下:
public function remove_user(Project $project, User $member)
{
$project->members()->detach($member->id);
return redirect('/projects/'.$project->id);
}
由于您要在路由中传递两个参数。因此,您将获得一个Project
模型的实例和一个User
模型的实例。然后只需访问该关系,并使用detach()
访问$user->id
方法即可完成工作。您可以通过在detach()
方法中传递ID数组来分离多个用户,也可以通过不带任何参数调用detach()
来从项目中删除所有用户。