我正在尝试在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");
}
}
在控制器上,添加或修改或删除运动项时,最佳做法是什么?
我知道可以使用很多对很多同步。在此,最佳解决方案是什么?我认为从数据库加载完所有内容后我是否应该每次进行比较,这不是一个好习惯。
答案 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在建立新应用程序的初始关系和支架时特别有用。