【问题标题】:How can I get sum of tasks that belongs to project in Laravel?如何在 Laravel 中获取属于项目的任务总和?
【发布时间】:2020-11-19 01:48:16
【问题描述】:

我有属于列表的任务和属于项目的列表。 我没有任务-项目关系。 我需要使用 whereHas 函数 找到项目中所有任务的总和,并在 Project.vue 组件中显示该总和。

这是任务表:

  Schema::create('tasks', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->unsignedBigInteger('list_id');
            $table->foreign('list_id')
                ->references('id')
                ->on('task_lists')
                ->onDelete('cascade');

            $table->boolean('completed')
                ->default(false);
            $table->string('description');

        });

这是列表:

    Schema::create('task_lists', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->string('description');
        $table->unsignedBigInteger('user_id');
        $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');
        $table->unsignedBigInteger('project_id');
        $table->foreign('project_id')
            ->references('id')
            ->on('projects')
            ->onDelete('cascade');
        $table->timestamps();

    });

项目模型中的关系:

public function lists()
{
    return $this->hasMany(TaskList::class);
}

TaskList 模型中的关系:

public function tasks()
{
    return $this->hasMany(Task::class);
}

public function project()
{
    return $this->belongsTo(Project::class);
}

任务模型中的关系:

   public function list()
    {
        return $this->belongsTo(TaskList::class);
    }

【问题讨论】:

    标签: laravel vue.js eloquent


    【解决方案1】:

    您始终可以使用hasManyThrough,如其余答案中所述,这显然是一种优雅的方式。

    但如果你不想那样做,你可以用这个。

    $tasks_count = Task::whereHas('list', function($query) use($project_id){
              $query->whereHas('project', function($query) use($project_id){
                  $query->where('id', $project_id); 
              });
          })
       ->with([
         'list' => function($query) use($project_id){
              $query->whereHas('project', function($query) use($project_id){
                  $query->where('id', $project_id); 
              });
          },
          'list.project' => function($query) use($project_id){
             $query->where('id', $project_id);
          },
      ])
      ->count();
    

    【讨论】:

    • 谢谢!我不被允许建立新的关系,我不得不使用 hasMany,所以你帮了我很多!
    【解决方案2】:

    或者你可以简单地做[如果不使用 hasManyThrough]

    $project=Project::find($id);
    $project->lists()->list()->count();
    

    【讨论】:

    • 在访问关系时要小心使用()。如果您正在使用任何急切加载,这将创建新的查询,无论您已经加载了什么......
    • 我们可以使用 with() 来减少查询次数吗?
    • 通过使用 has many through,您可以执行类似 Project::with(['tasks']) 甚至像 Project::with(['lists.tasks']) 一样的操作来急切加载关系以保持低查询数。
    • 谢谢。只是让一个方法来计算它们。没有考虑性能问题
    【解决方案3】:

    要获取项目的所有任务,您可以添加hasManyThorugh 关系。 documentation

    public function tasks()
        {
            return $this->hasManyThrough('App\Task', 'App\TaskList');
        }
    

    在您的代码中,只需调用上面定义的关系即可在Project 中获取Tasks

    $project->tasks()->count() 
    

    【讨论】:

      【解决方案4】:

      尝试在Project 模型上为tasks 创建HasManyThrough 关系。

      public function tasks()
      {
          return $this->hasManyThrough(Task::class, TaskList::class);
      }
      

      然后你应该可以去$project->tasks->count()

      https://laravel.com/docs/7.x/eloquent-relationships#has-many-through

      【讨论】:

        猜你喜欢
        • 2018-06-01
        • 2015-07-24
        • 2019-03-08
        • 2016-01-24
        • 2013-07-18
        • 2021-12-12
        • 2014-11-04
        • 1970-01-01
        • 2014-11-04
        相关资源
        最近更新 更多