繁体   English   中英

Laravel - 从多对多关系中获取数据

[英]Laravel - Get data from Many to Many relationship

我正在构建一个小型应用程序,以便在 Laravel 7 中试验多对多关系。此应用程序是关于项目和用户(多对多)的。

经过身份验证的用户可以创建新项目。 每个项目都有自己的页面。 在项目的页面上,将呈现一个列表,其中包含作为该项目成员的每个用户的名称,并且在每个名称旁边,是一个应该从该项目中删除特定用户/成员的按钮。

现在,我被困在“删除用户”function 上。 我不明白如何获取列表中每个用户的 id,并将其传递给 function,它将“分离”多对多关系。

我的文件如下:

迁移

用户表:

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

项目_表:

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

型号

用户.php:

public function projects()
{
    return $this->belongsToMany('App\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');

Controller

项目控制器.php:

public function remove_user(Project $project)
{
    $user_id = $project->members()->id;
    $project->members()->detach($user_id);
    return redirect('/projects/'.$project->id);
}

我知道这显然是不正确的,但是使用此配置会出现以下错误:

未定义属性:Illuminate\Database\Eloquent\Relations\BelongsToMany::$id

http://localhost/rel_test/public/projects/6/remove_user/2

你们能帮忙吗? 先感谢您

尝试这个:

public function remove_user(Project $project, User $member)
{
    $project->members()->detach($member->id);
    return redirect('/projects/'.$project->id);
}

由于您在路线中传递了两个参数。 因此,您将获得一个Project model 实例和一个User model 实例。 然后只需访问关系并使用$user->id访问detach()方法即可完成工作。 您可以通过在detach()方法中传递 id 数组来分离多个用户,或者通过不带参数调用detach()从项目中删除所有用户。

参考这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM