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

Laravel 8多对多关系更新/删除API(数据透视表)

呼延卓
2023-03-14

您好,当我更新或删除API中的数据时,我需要有关laravel 8多对多关系透视表的帮助。这些是我的文件信息。首先,我创建了两个表:Companies(迁移文件)

public function up()
{
    Schema::create('companies', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();                
        $table->timestamps();
    });
}

联系人(迁移文件)

public function up()
{
    Schema::create('contacts', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();            
        $table->timestamps();
    });
}

在此之后,创建透视表company\u contact(迁移文件)

  public function up()
{
    Schema::create('company_contact', function (Blueprint $table) {
        $table->foreignId('company_id')->constrained();
        $table->foreignId('contact_id')->constrained();
    });
}

模型如下所示:公司模型

class Company extends Model{

use HasFactory;

protected $fillable = [
    'name', 
    'email'
];

public function contacts()
{
    return $this->belongsToMany(Contact::class);
}

}

联系人模型

class Company extends Model{
use HasFactory;

protected $fillable = [
    'name', 
    'email'
];

public function contacts()
{
    return $this->belongsToMany(Contact::class);
}

}

我的路线文件

Route::apiResource('companies', CompanyController::class);

我的公司控制人

class CompanyController extends Controller{

 public function index()
{
   return CompanyResource::collection(Company::all());
}   

public function store(CompanyStoreRequest $request)
{
    $company = Company::create($request->validated());  
    $company->contacts()->attach($request->input('contact_id'));          

    return new CompanyResource($company);
}

public function show(Company $company)
{
    //
}

public function update(CompanyStoreRequest $request,Company $company)
{
    $contacts = Company::where('id', $company->id)->contacts()->get();    
    $company->contacts()->sync($request->input(['contact_id'])); 
    $company->update($request->validated());       

    return new CompanyResource($company);
}

public function destroy(Company $company)
{
 
}

}

公司存储请求

public function rules()
{
    return [
        'name' => ['required'],
        'email' => ['required', 'email'], 
        'contact_id' =>['required']
    ];
}

公司资源

public function toArray($request)
{
    //return parent::toArray($request);
    return [
        'id' => $this->id,
        'name' => $this->name,
        'email' => $this->email,
        'contact_count' => $this->contacts()->count()
    ];
}    

也许有人可以帮助我在公司控制器中编写正确的store()和destroy()方法。例如,当我更新公司数据时,我还想添加更多联系人,并将这些联系人id保存在数据透视表中。使用destroy方法,当我删除某个公司时,我还希望自动删除透视表中的这些id(与联系人的关系公司)。

谢谢你的帮助。

共有1个答案

曾嘉福
2023-03-14

首先,您可以将一个数组中联系人的数据与公司的数据一起传递,将一个数组用于多个联系人,并使用foreach和attach方法记录关系,然后对其进行搜索。关于删除,您可以使用softDelete,也可以对其进行搜索,它可以对项目进行级联删除。

 类似资料:
  • 如果我尝试以下操作,则页面正在加载: 有以下表格:-用户-user_department-部门 数据透视表用户\u部门有两个外键:-部门\u id-用户\u id 在我的用户模型中: 在我的部门模型中: 顺便说一下:以下代码正在工作: 但是我无法在不破坏我的页面的情况下获得用户的部门。 有什么想法吗?

  • 用户表结构:用户 id、名称、用户名、密码、创建时间、更新时间 文章表结构:文章 id、标题、内容、创建时间、更新时间 关系表:文章\用户 id、文章id、用户id处于活动状态、创建时间、更新时间 标签 id、名称、用户id、创建时间、更新时间 透视表项目用户与标记的关系。表:文章\用户\标签 标签号,物品号,用户号 我想连接这些表,以便可以像这样或类似的格式访问 并且应该能够创建/更新smth,

  • 我正在创建一个应用程序,其中用户可以被分配到多个组织,组织可以有多个用户--多对多的关系。 我希望能够这样做:以及 我有表... 我有表... 呃!用户-组织,组织-用户! 和我有数据透视/映射/等。表 表有一个字段和一个字段。 Elecoquent假设并期望-但这不是我为表命名的,也不想重命名。 我设置了以下内容 用户: 然后我测试一下: 并得到以下错误: SQLState[42S02]:找不到

  • 在我的项目中,我使用Spring数据jpa。我有多对多关系的表格。我的实体: 和零件: 现在在Controller中,我尝试从表部分中删除一行: 但我有例外: 区分完整性约束冲突:“FK9Y4MKICYBLJWPENACP4298I49:PUBLIC.PARTS外键(ID\u导出)引用PUBLIC.EXPORT(ID)(1)”;SQL语句:/*删除com.aleksandr0412.demo.en

  • 问题内容: 我要删除具有多对多关系的一个站点上的表中的一行。我还想删除该关系另一侧的所有相关行。 例如,假设我有以下表格,并且想从中删除一行。我也想从中删除所有相关的行,当然,也删除其中不再需要的任何行。 我知道如何在查询中连接以上表格。但是我看不到如何删除整个关系中的数据。 注意:关系的两端都实现级联删除。因此,例如,从中删除行将删除中的任何相关行。但是显然,这不会传播到表中。 问题答案: 我认

  • 问题内容: 我是一起定义关系和框架的新手,我只是习惯于原始SQL。我做了家庭作业(google + Laravel文档),但是我认为我不太了解它。 以下是相关信息:用户表: 挑战表: User_challenge_links Challenge_sub_categories 所以我的目标..用户->挑战。 关系: 一个用户有许多User_challenge_links 一个User_challen