【问题标题】:How to join 2 tables in Laravel?如何在 Laravel 中加入 2 个表?
【发布时间】:2019-08-26 10:45:36
【问题描述】:

我有两个模型一个项目和一个任务。在任务模型上,我有一个 fK project_id 和 2 个整数字段,用于输入以分钟和小时为单位的持续时间。 我想单击项目,获取其 ID,然后查看任务表并根据具有 project_id 的 fk 的所有任务计算该项目的小时数和分钟数。

这是我尝试过的

项目 - 模型

public static function getTotalHoursInProgressProject() {
    $project =Project::all();
    $projectHrsProgress = Task::where('project_id', '=', 'project.id')->where('board_column_id', '=' ,'6')->sum('duration_hrs');
    $taskHours =  $projectHrsProgress * 60;
    $projectMinProgress = Task::where('project_id', '=', 'project.id')->where('board_column_id', '=' ,'6')->sum('duration_min');
    $finalHrsInprogress = ($taskHours + $projectMinProgress )*0.016667;
    // $finalHrsInprogressTotal = (float) $finalHrsInprogress;

    return number_format((float)$finalHrsInprogress, 2, '.', '');;
  }

在控制器中

public function show($id)

{

    $this->project = Project::findOrFail($id);
    $this->categories = TaskCategory::all();
    $this->taskInProgress = Project::getTotalHoursInProgressProject();


    return view('admin.projects.tasks.show', $this->data);
}

在视图中

 <div class="col-md-3">
                                            <div class="white-box p-t-10 p-b-10 bg-warning">
                                                <h3 class="box-title text-white">In Progress Hours</h3>
                                                <ul class="list-inline two-part">
                                                    <li><i class="icon-layers text-white"></i></li>
                                                    <li class="text-right"><span id="" class="counter text-white">{{ $taskInProgress }}</span></li>
                                                </ul>
                                            </div>
                                        </div>

这是我遇到的错误

SQLSTATE[42S22]:找不到列:1054 '字段列表'中的未知列 'duration_min'(SQL:选择 sum(duration_min) 作为来自tasks 的聚合,其中project_id = project.id 和@987654329 @ = 6 和tasks.company_id = 1)

【问题讨论】:

  • Why should I provide a Minimal Reproducible Example for a very simple SQL query? ..你也应该提供更多的PHP代码来定义你的模型..
  • 我还想知道在 MySQL 中创建视图是否更容易并获得更高的性能...CREATE ALGORITHM=MERGE VIEW ... AS (&lt;query_with_joins&gt;) 并使用 Laravel 进行选择。ALGORITHM=MERGE 将优化/重写已完成的查询在 VIEW 上查看视图定义,这在手册 View Processing Algorithms 中有更好的解释......这使得 VIEW 像 SQL 预处理器或 SQL 模板引擎一样工作更容易说......

标签: mysql laravel laravel-5


【解决方案1】:

您可以在您的项目模型中创建 laravel 有关系,然后您可以访问查询中的关联数据。

您还可以通过在模型中创建两个函数来获取总时间,如下所示。

在项目模型中:

public function Task()
 {  
   return $this->hasMany('App\Task');    
}

public function TotalTaskHour()
{  
    return $this->hasMany('App\Task')
        ->selectRaw('SUM(duration_hrs) as total_hrs')
        ->groupBy('project_id');    
}

public function TotalTaskMinute()
    {  
        return $this->hasMany('App\Task')
            ->selectRaw('SUM(duration_min) as total_mins')
            ->groupBy('project_id');    
    }

现在在您的控制器中访问这样的关联数据。

在控制器中:

public function show($id)
{

    $project = Project::with('TotalTaskHour')->with('TotalTaskMinute')->with('Task')->findOrFail($id);
    $totalHour = $project->TotalTaskHour->total_hrs;
    $totalHoour = $project->TotalTaskHour->total_mins;

   $taskInProgress = $project->getTotalHoursInProgressProject();

    dd($project); 
}

确保您还创建了任务模型。

【讨论】:

  • 是的!谢谢!我也在寻找同样的东西。
【解决方案2】:

在两个模型 Project & Task 之间使用一对一的关系

public function show($id)
{

    $project = Project::with('tasks')->findOrFail($id);
    $taskInProgress = $project->getTotalHoursInProgressProject();


    return view('admin.projects.tasks.show',compact('taskInProgress'));
}

【讨论】:

  • 感谢您的回答,但仍然无法正常工作我收到以下错误 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'duration_min' in 'field list' (SQL: select sum (duration_min) 作为来自tasks 的聚合,其中project_id = project.id 和board_column_id = 6 和tasks.company_id = 1)
猜你喜欢
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 2016-04-03
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多