Laravel从一对多关系中的多表中获取最后一行的值 [英] Laravel get last row value form many table in one to Many relationship

查看:62
本文介绍了Laravel从一对多关系中的多表中获取最后一行的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在构建一个具有一对多关系模型的应用程序.在模型中,学生表与学生地址详细信息具有一对多关系.我想从地址详细信息表中检索最后一行.我一直在研究如何检索该数据.我无法从该网站上的类似答案中得出结论.

I am building an application which has a model with one to many relationship. In the model, the student table has one to many relationship with student address details. I want to retrieve the last row from address details table. I am stuck on how to retrieve that data. I could not work out from similar answer on this website.

我当前的解决方案是

$students = Student::with('visaDetails', 'addresses', 'instituteDetails', 'subAgents',
            'staffDetails', 'commissionDetails', 'comments')->paginate(16);

        foreach ($students as $student){
            foreach ($student->addresses as $address){
                dd($address->id);
            }
        }

我的学生模型如下

class Student extends Model
{
    //One to Many relation to student address

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

但是,由于记录数量呈指数增长,因此该解决方案效率不高.另外,我还需要找到其他许多表的最后一行.

But this solutions is not efficient as number of record grows exponentially. Also, I need to find last row for other many table as well.

如果有人可以帮助我,那就太好了.

If anybody could help me then it would be very nice.

推荐答案

要从地址表中获取每个学生的最新记录,可以使用以下自我加入的查询

To get latest record from address table for each student you can go with following self joined query

SELECT s.*, a.*
from students s
join address a on s.id = a.student_id
left join address a1 on a.student_id = a1.student_id
and a.created_at < a1.created_at
where a1.student_id is null

我以最新的方式认为您需要具有最新 created_at 属性的地址.

I assume by latest means you need address with most recent created_at attribute.

使用查询生成器,您可以将其重写为

Using query builder you might rewrite it as

DB::table('students as s')
  ->select('s.*', 'a.*')
  ->join('address as a', 's.id', '=', 'a.student_id')
  ->leftJoin('address as a1', function ($join) {
        $join->on('a.student_id', '=', 'a1.student_id')
             ->whereRaw(DB::raw('a.created_at < a1.created_at'));
   })
  ->whereNull('a1.student_id')
  ->get();

Laravel Eloquent选择具有max的所有行created_at

Laravel-获取以下项的最后一个条目每个UID类型

按最新记录记录的Laravel口才组

这篇关于Laravel从一对多关系中的多表中获取最后一行的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆