我对从DB获取数据的最佳方式感到困惑。我有这个控制器(任务)从任务模型获得每个客户的任务。获取这些数据的最佳方法是什么?
在这个例子中,我有一个连接表(Task和Companies)的“通用”函数(getTasksCompany)。 showTasks调用此函数,然后使用where子句获取客户代码= 000001
的仅任务display:none;
在这个例子中,我有一个“特定”函数,它从传递的参数中的代码中获取任务。
public function showTasks() {
$tasks = $this->getTasksCompany()->where("company_code", "=", "000001")->get();
dd($tasks);
}
public function getTasksCompany() {
$tasks = Task::join("companies AS c", "c.code", "=", "company_code");
return $tasks;
}
在这个例子中,我有一个连接表(任务和公司)的“通用”功能(getTasksCompany),我使用任务模型中定义的范围来过滤任务。
public function showTasks2() {
$tasks = $this->getTasksFromCompany("000001");
dd($tasks);
}
public function getTasksFromCompany($company_code) {
$tasks = Task::join("companies AS c", "c.code", "=", "company_code")->where("company_code", "=", $company_code)->get();
return $tasks;
}
我的问题是,做什么是好的做法?为什么?
答案 0 :(得分:1)
我建议您彻底研究雄辩和查询构建器,这就是最佳实践。
如果正确使用eloquent with query builder,则不需要其他函数来获取所需的数据。
答案 1 :(得分:1)
根据我的理解,要求最佳实践会吸引固执的答案但,因为您使用Laravel,我会尽可能地尝试使用它提供的功能。
虽然我更喜欢第三个示例而不是其他示例,因为使用模型scope
有助于从模型实例创建和绑定查询构建器。当您重复使用此功能时,这将使事情变得更容易。
这意味着您不需要静态调用任何查询构建器方法,因为它们首先绑定到初始模型。
如果我要做上述操作的一个例子,我只会使用模型关系来处理我的joins
:
//Company model
public function scopeShowTask($company_code = "000001")
{
return $this->tasks()->where("company_code", "=", $company_code);
}
public function tasks()
{
return $this->hasMany(Task::class, 'company_code', 'code');
}
使用此方法有助于根据任务和公司之间的关系构建查询。为了理解其工作原理,您应该查看Eloquent Relationship
使用此方法的一个巨大优势是,当您以这种方式在模型中声明关系时,您可以轻松利用laravel提供的各种方法。要查看其中一些内容,您可以查看Querying relationship
PS:最佳实践,不,也许只是一种更好的做法。此答案可向更新 开放