【问题标题】:How to fetch records from two different tables in laravel5.2laravel5.2 如何从两个不同的表中获取记录
【发布时间】:2016-12-01 17:15:51
【问题描述】:

我有两个表“approval”和“renewal”,都有一个共同的列“applicant_id”。

当新的应用程序进来时,它会在表'approval'中存储一条数据记录以及为其添加记录的'applicant_id'。

现在,当同一申请人申请续订时,将在“续订”表中创建引用“applicant_id”的行

注意:“applicant_id”表“approval”中可以有一条记录,但“renewal”表中同一“applicant_id”可以有多个记录。

现在,我的要求是: 我需要从两个表中获取所有申请人的记录。

条件:如果表中存在“applicant_id”的数据,并且“续订”表中有多个相同的“applicant_id”行,那么我只需要从“续订”表中获取记录最新的一个。 如果 'renewal' 表中没有数据但存在于 'applicant_id' 的 'approval' 表中,则 fetch 记录应该获取 'approval' 表中存在的数据。 基本上,如果“续订”表中有申请人的记录,则从那里获取最新的记录,如果仅在“批准”表中存在记录,则获取该记录,但如果出现,则应优先从“续订”中获取存在。

我正在尝试在 laravel 5.2 中执行此操作。那么,有没有人可以帮助我呢?

【问题讨论】:

    标签: mysql orm laravel-5.2


    【解决方案1】:

    如果您使用 Eloquent,您将拥有 2 个模型:

    续订.php

    <?php
    namespace App;
    use Illuminate\Eloquent\Model;
    
    class Renewal extends Model
    {
        protected $table = 'renewal';
    
        public static function findMostRecentByApplicantId($applicantId)
        {
            $applicant = self::where('applicant_id', '=', $applicantId)
                             ->orderBy('date_created', 'desc')
                             ->first();
    
            return $applicant;
        }
    }
    

    Approval.php

    <?php
    namespace App;
    use Illuminate\Eloquent\Model;
    
    class Approval extends Model
    {
        protected $table = 'approval';
    
        public static function findByApplicantId($applicantId)
        {
            $applicant = self::where('applicant_id', '=', $applicantId)
                             ->first();
    
            return $applicant;
        }
    }
    

    然后,在您要获取批准/续订记录的代码中,使用以下代码:

    if (! $record = Renewal::findMostRecentByApplicantId($applicantId)) {
        $record = Approval::findByApplicantId($applicantId);
    }
    
    //$record will now either contain a valid record (approval or renewal) 
    //or will be NULL if no record exists for the specified $applicantId
    

    【讨论】:

    • 感谢您的精彩回答,但我的要求是:我需要获取所有申请人的记录,而不是基于特定申请人。我正在尝试获取所有记录,以便我可以将它们列在数据表中,以供管理人员查看当前所有应用程序上应用/完成的最新活动。
    【解决方案2】:

    经过几次尝试,我找到了一种使用 raw 的方法:

    SELECT applicant_id, applicant_name, applicant_email, applicant_phone, renewed, updated_at
    FROM  (
    SELECT renewal_informations.applicant_id, renewal_informations.applicant_name, renewal_informations.applicant_email, renewal_informations.applicant_phone, renewal_informations.renewed, renewal_informations.updated_at 
    FROM renewal_informations
    UNION ALL
    SELECT approval_informations.applicant_id, approval_informations.applicant_name, approval_informations.applicant_email, approval_informations.applicant_phone, approval_informations.renewed, approval_informations.updated_at 
    FROM approval_informations
    ) result
    GROUP BY applicant_id
    ORDER BY applicant_id ASC, updated_at DESC;
    

    【讨论】:

    • 任何人如果有更好的方法,请告诉我!
    【解决方案3】:

    对于每一个 Approval id,可以有 b 多条记录用于更新表,这表明您具有一对多关系。您可以在模型中定义,例如

    Approval.php (App\Models\Approval)

    public function renewal()
    {
        return $this->hasMany('App\Models\Renewal', 'applicant_id')
    }
    

    已定义此关系。您可以使用申请人 ID 从表中获取记录。

    $renewal_request_records = Approval::find($applicant_id)->renewal();
    

    这将从续订表中针对该申请者 ID 获取所有记录。

    寻找最新的

    $latest = Renewal::orderBy('desc', 'renewal_id')->first();
    

    进一步阅读Eloquent Relations

    【讨论】:

    • “更新”表中不会有记录。无论如何,感谢您的努力!
    猜你喜欢
    • 2018-06-10
    • 2013-01-09
    • 2015-02-15
    • 2014-06-05
    • 2015-05-16
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多