【问题标题】:Json response filtered by ID from another table in Laravel从 Laravel 中的另一个表中按 ID 过滤的 Json 响应
【发布时间】:2020-05-22 00:11:37
【问题描述】:

目前我的数据库中有这 2 个不同的 views

第一个是view_project_percentage,其中列出了所有项目及其详细信息

view_projtask 每个特定项目的任务列表

view_project_percentage

view_projtask

我有这个工作代码

我的模特

Project.php

 <?php

 namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Project extends Model
{
protected $table = "view_project_percentage";

public function tasks()
{
    return $this->hasMany(ProjectTask::class, 'projCode', 'proj_code')
    ->where('deleted',0);
}
}

ProjectTask.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class ProjectTask extends Model
{
protected $table = "view_projtask";

public function project()
{
    return $this->belongsTo(Project::class, 'proj_code', 'projCode')
    ->where('deleted',0)
    ->where('taskDeleted',0);
} 
}

在我的Controller 我有这个

 public function get_all_projtask()
{
    return response()->json(Project::with('tasks')->get());
}

我从上面的代码中得到了所有项目列表和这个响应

 [
{
    "id": 9,
    "proj_code": "ZQQKVOTRJJNZ",
    "proj_title": "P12",
    "proj_desc": "Project Description 12",
    "target_man_days": 1000000,
    "issue": 0,
    "report": 1,
    "total_employee": 3,
    "hours_8": "4",
    "hours_6": "1.0",
    "hours_3": "0",
    "total_weight_progress": "5.00",
    "est_start_date": "2020-01-20 09:42:00",
    "est_end_date": "2020-01-20 21:42:00",
    "act_start_date": "2020-01-20 09:42:00",
    "act_end_date": "2020-01-20 21:42:00",
    "longitude": "121.07642460",
    "latitude": "14.56055010",
    "location": "Pasig, Metro Manila, Philippinae",
    "status": null,
    "deleted": 0,
    "by_id": 7,
    "updated_by": "Keigh Dee",
    "created_at": "2020-01-20 09:42:31",
    "updated_at": "2020-01-22 14:01:08",
    "tasks": [
        {
            "id": 40,
            "projCode": "ZQQKVOTRJJNZ",
            "taskCode": "OKIX19IR1DST",
            "total_task_weight": null,
            "taskWeight": "25.00",
            "plan_days": "5",
            "actual_days": "5",
            "task_title": "Task 1",
            "task_desc": "Description 1",
            "taskDeleted": 0,
            "deleted": 0,
            "by_id": 79,
            "updated_by": "Super Admin",
            "created_at": "2020-01-22 14:01:08",
            "updated_at": "2020-01-22 14:01:08"
        },
        {
            "id": 41,
            "projCode": "ZQQKVOTRJJNZ",
            "taskCode": "FZPRFIWOKBFQ",
            "total_task_weight": "5.00",
            "taskWeight": "25.00",
            "plan_days": "5",
            "actual_days": "5",
            "task_title": "Task 2",
            "task_desc": "Description 2",
            "taskDeleted": 0,
            "deleted": 0,
            "by_id": 79,
            "updated_by": "Super Admin",
            "created_at": "2020-01-22 14:01:08",
            "updated_at": "2020-01-22 14:01:09"
        },
        {
            "id": 39,
            "projCode": "ZQQKVOTRJJNZ",
            "taskCode": "J5X1FHCMVFSQ",
            "total_task_weight": null,
            "taskWeight": "50.00",
            "plan_days": "5",
            "actual_days": "5",
            "task_title": "Task 5",
            "task_desc": "Description 5",
            "taskDeleted": 0,
            "deleted": 0,
            "by_id": 79,
            "updated_by": "Super Admin",
            "created_at": "2020-01-22 14:01:08",
            "updated_at": "2020-01-22 14:01:08"
        }
    ]
},
 ........and projects more....

我要做的是根据当前auth()-&gt;user()-&gt;company_id 过滤这些项目以过滤它们。我有一张名为tbl_emp_proj 的表,其中所有projCodeemp_id 一起列出,这意味着每个用户都包含多个或单个项目。

这是我的桌子

如果项目是为使用此auth()-&gt;user()-&gt;company_id = emp_id 的用户提供的,我只想显示来自tbl_emp_proj 的记录是deleted = 0 的响应

emp_id 来自tbl_emp_proj

【问题讨论】:

  • 不确定我是否误解了您的要求,但您不能添加 where('emp_id', auth()->user()->company_id) 或其他内容吗?
  • Project.php 的模型是 view_project_percentageProjectTask.phpview_projtask 我不认为我可以这样做,因为与 tbl_emp_proj 没有任何联系,因为 emp_id 是位于那张桌子上
  • 您应该在 emp_id(无论它属于什么模型)和项目模型之间添加一对多的关系。然后,您可以在调用中添加 whereHas() 过滤器。
  • 你能给我举个例子吗?我对这个框架还是很陌生,仍然采用编码风格。
  • user 和 tbl_emp_proj 是如何连接的?

标签: php json laravel


【解决方案1】:

您可以为您的员工项目创建另一个模型

<?php

...
class EmployeeProject extends Model
{
protected $table = 'tbl_emp_proj';

public function projects()
{
    return $this->hasMany(Project::class, 'projCode');
}

在您的控制器中,您可以使用他们的员工 ID 和延迟加载关系对其进行过滤。

顺便说一句,阅读更多文档here

public function get_all_projtask()
{
    $useProject = EmployeeProject::where(['emp_id' =>auth()->user()->company_id])-firstOrFail();
    return response()->json($useProject->load('projects.tasks'));
}

【讨论】:

  • 你好,我遇到了这样的问题"message": "Call to a member function load() on null",..
  • @RaeIan 请检查 $userProject 是否有价值,我更新了我的空值检查答案。卡巴扬
  • 谢谢你!该代码正在运行,我只是登录了错误的帐户并使用了一个没有记录的公司 ID,现在它正在运行
  • 理想情况下,员工-项目关系应该是EmployeeProject 模型之间的枢纽。但很公平,如果不查看更多代码库,您就无法构建这样的支点。
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
相关资源
最近更新 更多