首页 > 解决方案 > 来自单个控制器的多个模型

问题描述

我是 laravel 的新手,总的来说有点生疏,所以请耐心等待。我想知道最好的方法是什么。

我有几个表和几个 mysql 视图。每个表或视图都有自己的模型(对吗?)。

表: 用户部门站点、用户时间

视图: FullUser(加入用户部门站点)、UserTime(加入用户、用户时间)、UserDateOnly(加入用户、用户时间并按日期/用户分组)

对于每个主管(在用户中标记),我需要列出所有主管员工(链接到用户),并为每个员工列出按日期分组的所有时间。所以基本上结果将是一个员工列表,每个日期都有一个日期列表,每个日期都有一个多次列表。

首先,我应该将此方法添加到用户控制器还是为此创建一个单独的控制器,因为它将查询多个模型?

其次,我对这个过程的计划是:

  1. 从FullUser获取主管的所有相关员工的列表。
  2. 遍历结果并查询每个结果的UserDateOnly视图以获取该用户的所有日期。
  3. 循环遍历结果并查询每个日期的UserTime视图,以获取该用户在该日期的所有时间。
  4. 将结果添加到此布局中的集合以传递给视图:

雇员[]

----员工->empoyee_details

- - - - 日期[]

------------时间->时间

这看起来是否合理,我是否应该在一种控制方法中完成所有这些操作。如果不从视图中进行查询,我想不出另一种方法来做到这一点。

谢谢。

标签: mysqllaravelmodelcontroller

解决方案


控制器只是具有更好干净代码的文件,但它们并没有真正分配给模型,您可以拥有 UserController 但将任何您想要的东西放在那里并从那里获取您想要的任何模型:

class UserController {

   public function getPhotos(Request $request, Photo $photo){
       return $photo;
   }

}

您的问题更多是关于数据库查询,这可以通过模型(Eloquent)来完成,例如,如果您想获得类型主管的用户,假设您将其作为表中的列

User::where('is_supervisor', 1)->get() // Get all;
User::where('is_supervisor', 1)->first() // get the first result row in db

现在,如果您想让它更复杂并想进入Eloquent Relations,那么这是一个您需要阅读的全新主题。

例如,您可以为用户分配部门,反之亦然

准备好迁移(数据库表)

对于用户迁移文件

如果用户属于单个部门department_id,则需要在此处添加一个名为 的列。


    // appending to users migrations 
    ....
    $schema->unsignedBigInteger('department_id')->nullable();
    ....

然后在Users.php模型中你需要添加这个

....
public function department(){
   return $this->belongsTo('App\Department'); // or $this->belongsTo(Deparment::class); if you want to put use `App\Deparments` in the head of your php model file
}

然后,您可以像这样从用户对象中获取部门对象,如果需要,可以在控制器中:

$User = User::first()->department;

上面的代码将尝试根据所选用户中的值从数据库中的部门表中选择部门行department_id,所以如果你有一个 id 为 1 和部门 ID 为 2 的用户,你告诉 Laravel 获取用户对象id 为 1,然后访问->department关系,它将根据指定的 id 获取该关系,并为此返回 id 为 2 的部门对象,这样做你就可以访问该部门对象的数据,就像你可以做的那样:User::first()->department->title这将为您提供部门的标题栏。

这是一个很长的话题,有很多可能性,我建议你为此阅读Laravel 关系

您最好的朋友在这里并且永远是dd帮助者,每当您怀疑代码的输出时dd(),就像这样,如果您想看看它User::first()->department有什么,您可以dd(User::first()->department);在有疑问时查看数据。


推荐阅读