繁体   English   中英

Laravel最佳做法-查询

[英]Laravel best practice - Query

我需要将一些数据传递给我的视图。 我有一个用户模型和一个提示模型。

User模型有一个返回用户hasMany(Tip :: Class)的方法,而Tip模型有一个返回尖头属于To(User :: class)的方法。

我正在为用户创建个人资料页面,并在访问个人资料时使用路由模型绑定返回用户模型。

public function tipsterProfileShow(User $tipster)
{
  if (!$tipster->isTipster())
  {
    return redirect()->route('home');
  }

  return view('profile.index')->with([
    'tipster' => $tipster,
    'tips' => $tipster->tips(),
  ]);
}

我想显示一些数据,例如提示表中状态栏所指示的正确提示数。

目前,我正在使用刀片视图

{{$tips->where('status','Won')->count()}}

我觉得这不是最佳做法,但我可能错了。

像下面这样做会更好吗?

public function tipsterProfileShow(User $tipster)
{
  if (!$tipster->isTipster())
  {
    return redirect()->route('home');
  }
  return view('profile.index')->with([
    'tipster' => $tipster,
    'tips' => $tipster->tips(),
    'wins' => $tipster->tips()->where('status', 'Won')->count()
  ]);
}

这样,我就可以将查询保留在视图之外。 我对laravel和“最佳实践”真的很陌生,因此尝试寻求一些建议。

您正在询问的最佳实践通常不被接受,但这确实是每个初学者都必须学习的基本知识,因此我仍然认为它应该是一个答案。

简而言之:是的! 您正在做的事情是朝着使代码保持逻辑分离迈出的伟大的第一步。 您的视图应负责显示数据,而控制器应负责将数据处理到视图中。 控制器是否应该真正负责计算数据是另一个话题,这个话题一直在争论。

也就是说,如果应用一些其他逻辑,则可以将其简化为控制器中的一行:

public function tipsterProfileShow(User $tipster)
{
  return view('profile.index', compact('tipster'));
}

第一步是向您的User模型添加一个方法,如下所示:

public function winCount()
{
    return $this->tips()->where('status', 'Won')->count();
}

现在,您可以从视图访问$tipster->winCount() 您也可以在视图中直接访问$tipster->tips() -大多数人都认为这很好。

第二步是将对非小提包的重定向调用提取到中间件中,您可以在此处了解有关内容: https : //laravel.com/docs/5.3/middleware

您可能会从那里采取进一步的步骤,但这是一个很好的起点。 祝好运! :)

我将建议您创建一个POPO(普通的旧PHP对象) ,该POPO将包含用户的完整描述,而该描述与User个人资料更为同义。

laravel中的模型代表表中的一行,它将延迟加载与其关联的任何关系。

因此,如果您有POPO ,则可以定义与用户相关的所有内容并将其传递给视图,而无需在视图中查询。

以下面为例:

Class UserPorfile{
  private $id;
  private $username;
  private $tips;

  public function setId($id){
     $this->id = $id;
  }

  public function getId(){
     return $this->id;
  }

  public function setUsername($username){
      $this->username = $username;
  }

  public function getUsername(){
     return $this->username;
  }

  public function setTips(array $tips){
     $this->tips = $tips;
  }

  public function getTips(){
     return $this->tips;
  }
}

将此类的对象传递给您的视图似乎要好得多

是的,你是对的。 考虑到您尝试遵循MVC软件开发模式,应该避免将业务逻辑放在您的视野中。

这行代码:

{{$tips->where('status','Won')->count()}}

实际上是在做两件事:

  1. 在模型中查询具有特定条件的所有对象
  2. 计算结果

通过遵循MVC原理,应该由您的控制器将命令发送到模型,而不是视图。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM