Laravel雄辩的关系属于要更新

时间:2019-08-09 16:42:24

标签: laravel eloquent relationship

我正在尝试在belongsTo关系中更新/删除/创建。

公司有很多运动 体育属于公司

这是两个模型。

class CompanySports
{
    public function company()
    {
        return $this->belongsTo(Company::class, "company_id","id");
    }


    class Company
    public function sports()
    {
        return $this->hasMany(CompanySports::class,"company_id","id");
    }
}

在控制器上,添加或修改或删除运动项时,最佳做法是什么?

我知道可以使用很多对很多同步。在此,最佳解决方案是什么?我认为从数据库加载完所有内容后我是否应该每次进行比较,这不是一个好习惯。

2 个答案:

答案 0 :(得分:0)

在添加公司模型的新记录时,您不需要做任何事情,因为还没有孩子。

在更新公司模型的实例时,同样,您不需要更新其子级上的任何内容。由于关系基于id(主键),因此我相信您在更新时不会更改。

现在要删除还有一些问题。您要在删除父级时删除子级吗?如果是这样,您可以使用 ON DELETE CASCADE (可以在迁移中进行设置)

$table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');

在您的spors表中。

好吧,您也可以像在here中回答那样做自己的功能

如果您不想删除子级,可以在模型上使用softdelete。建立关系就像

CompanySports

public function company()
{
    return $this->belongsTo(Company::class, "company_id","id")->withTrashed();
}

这样,即使删除了父级,也可以毫无问题地获取子级的父级。

答案 1 :(得分:0)

从代码中,我首先建议将模型放在单独的文件中,并确保它们单一。如果您使用artisan make:model命令生成存根,则它应该为您完成此操作。

// app/CompanySport.php                // <-- NOTE singular

class CompanySport                     // <-- NOTE singular
{
    public function company()
    {
        return $this->belongsTo(Company::class, "company_id","id");
    }
}
// app/Company.php

class Company {
    public function sports()
    {
        return $this->hasMany(CompanySport::class,"company_id","id");  // singular
    }    
}

从那里,我发现在各种类中构建辅助方法很有用,这样语法听起来自然,更重要的是,属于模型。例如:

// app/Company.php

class Company
{
    ...

    public function addSport(CompanySport $sport)
    {
        $this->sports()->save($sport);
    }

    public function removeSport(CompanySport $sport)
    {
        $this->sports()->find($sport->id)->delete();
    }
}

然后可以从任何地方轻松调用这些帮助器功能,例如控制器:

// CompanySportsController.php

public function store(Company $company, CompanySport $sport)
{
    $company->addSport($sport);

    return redirect('/company/' . $company->id);
}

如果您正在使用这些助手,则由于只使用一对多关系,因此无需进行比较或同步。口才是为您做的一切。

此外,我发现这个cheatsheet在建立新应用程序的初始关系和支架时特别有用。

相关问题