【问题标题】:How to Query if Multiple Columns Reference to the Same Table如何查询多个列是否引用同一个表
【发布时间】:2021-09-01 19:59:07
【问题描述】:

我在这里遇到了一个问题。我有一个名为 application 的表,它将记录谁请求了该应用程序,谁批准了它,以及谁拒绝了它。问题是 Requestor_id、Approver_id 和 Rejector_id 是对同一个表的引用。如何在 Laravel 中查询 requestor_name、approver_name 和 rejector_name

申请表

Requestor_id ( reference to user id)
Application_Status
Module_id
Approver_id ( reference to user id)
Rejector_id ( reference to user id)
created_at
updated_at

以下是我尝试过的,但它只能检索请求者名称

$Approval_Logs = DB::table('application')
    ->select('application.id','application.Application_Status', 'users.name','application.Approver_id','application.Rejector_id', 'ems_application.Request_Category','application.updated_at')
    ->join('ems_application', 'ems_application.Application_id', '=', 'application.id')
    ->join('users', 'users.id', '=', 'application.requestor_id')
    ->whereIn('application.Application_Status',['approved','rejected'])
    ->get()
    ->toArray();

我希望我能从你那里得到一些提示。提前致谢!

【问题讨论】:

  • 建议的解决方案对您有用吗?
  • @ggordon 是的,谢谢!很抱歉忘记将其标记为最佳答案。

标签: sql laravel eloquent laravel-8


【解决方案1】:

您也可以在联接中使用别名。

$Approval_Logs = DB::table('application')
            ->select(
                 'application.id',
                 'application.Application_Status', 
                 
                 'application.Approver_id',
                 'approver.name as approver_name',
                 'application.requestor_id', 
                 'requestor.name as requestor_name',
                 
                 'application.Rejector_id', 
                 'rejector.name as rejector_name',


                 'ems_application.Request_Category',
                 'application.updated_at'
            )
            ->join('ems_application', 'ems_application.Application_id', '=', 'application.id')
            ->join('users as requestor', 'requestor.id', '=', 'application.requestor_id')
            ->join('users as approver', 'approver.id', '=', 'application.approver_id')
            ->join('users as rejector', 'rejector.id', '=', 'application.rejector_id')
            ->whereIn('application.Application_Status',['approved','rejected'])
            ->get()
            ->toArray();

我对您的申请并不完全熟悉,但是如果没有批准者或拒绝者,您可能希望使用 left_join 而不是 join 来加入 approverrejector

【讨论】:

    【解决方案2】:

    如果你想用“Laravel”的方式来做。我会创建一个名为 Application 的模型并创建关系

    class Application extends Model {
    
        public function requestor(){
            return $this->belongsTo(Users::class, 'requestor_id');
        }
    
        public function approver(){
            return $this->belongsTo(Users::class, 'approver_id');
        }
    
        public function rejector(){
            return $this->belongsTo(Users::class, 'rejector_id');
        }
    }
    

    然后在您的控制器中,您可以运行以下查询:

    $application = Application::whereHas('requestor', function($query) {
                        $query->where('first_name', 'John');
                   })->whereHas('approver', function($query) {
                        $query->where('first_name', 'Peter');
                   })->whereHas('rejector', function($query) {
                        $query->where('first_name', 'Michael');
                   })->get();
    

    这应该查询用户表的名字。不知道效率如何,试试看吧;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 2019-10-10
      • 2016-01-13
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多