当前位置: 首页 > 知识库问答 >
问题:

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

华修永
2023-03-14

我正在构建一个小应用程序,以便在Laravel7中试验多对多关系。此应用程序涉及项目和用户(多对多)。

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

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

我的文件如下:

迁移:

用户列表:

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

}

项目用户表(透视):

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

我知道这显然是不正确的,但与此配置它给出了以下错误:

未定义的属性:Illumb\Database\Eloquent\Relations\BelongToMany::$id

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

你们能帮忙吗?先谢谢你

共有1个答案

单于淇
2023-03-14

试试这个:

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

因为您在路由中传递了两个参数。因此,您将获得一个Project模型实例和一个User模型实例。然后只访问关系,用$user-访问disach()方法

此处引用

 类似资料:
  • 我的表格结构如下: 公司表(有许多货物,有许多包裹) 创建包条目时,我希望执行以下操作: 如果我在$shipping上转储die,那么它在那里有所有正确的ID,并且我希望这些关系会允许创建它。但是,创建包失败,因为没有order_id(orders表中的id)的值 我是否误解了雄辩在这里的作用? 编辑: 命令 装运 包裹 为了创建一个订单,我使用以下工作正常。 要创建我试图使用的货件和包裹: 然而

  • 我在一个laravel控制器中运行以下代码, 但是我似乎从服务器上得到了以下错误, {“error”:{“type”:“ErrorException”,“message”:“preg_replace():参数不匹配,模式为字符串,而替换为数组”,“file”:“/Users/S/Sites/app api/vendor/laravel/framework/src/illumb/Support/he

  • 我有3个标签:用户、教师和帖子。 用户: id-integer name-string 教师: id-integer 教师id-integer 用户id-integer 姓名-string 帖子: id-integer user\u id-integer title-string 用户模型: 教师模式: ??问题是我如何使用这样的东西:

  • 我在Books表和Authors表之间有多对多的关系。透视表(author_book)包含author_id和book_id。

  • 问题内容: 我有dbo.Users表 然后我有dbo.Phones表 然后我有dbo.Relationship表 我如何进行查询返回 这就是我到目前为止所得到的。 问题答案: 在这里,将“关系”表视为“用户”和“电话”表之间的中间人。它与映射表是多对多关系。将您的用户加入到关系中,然后将其加入到您的电话中。 可以这样想: 用户: 您好关系,我的UserId = 1,我对那个UserId有什么电话I

  • 表朋友:id、用户id、朋友id。 表用户配置文件:id、用户id、名字。。。 如何通过雄辩的ORM获得用户的朋友列表? 用户id:5 |朋友id:6 user_id: 6|friend_id5 类似问题: 与拉拉维尔的友谊系统:多对多关系 拉维尔 我无法理解是谁调用了getFriendsAttribute()方法。 以及如何做到这一点查询生成器。 谢谢