使用 Eloquent 选择具有值的最后一条记录

Posted

技术标签:

【中文标题】使用 Eloquent 选择具有值的最后一条记录【英文标题】:Select Last Record With Value With Eloquent 【发布时间】:2014-05-16 14:42:19 【问题描述】:

我将字段和值存储在键值样式表中。我想随着时间的推移存储用户数据的修订。当我从他们的数据中选择时,我只想要每个键的最新值。

http://sqlfiddle.com/#!2/d7138

我目前正在急切加载,但是当我只想要每个键的最后一个值时,这会选择此数组中的所有键。

    public function healthProfile()
    
        return $this->hasMany('PortalUserMember', 'portal_user_id')
            ->whereIn('key', [
                'health.profile.sex',
                'health.profile.birthday_day',
                'health.profile.birthday_month',
                'health.profile.birthday_year',
                'health.profile.height_ft',
                'health.profile.height_in',
                'health.profile.weight_lbs',
                'health.profile.contact_street_1',

                            // Could be anything at any point.

                'health.profile.mail_pharmacy_name',
                'health.profile.mail_pharmacy_fax',
                'health.profile.mail_pharmacy_phone'
            ]);
    

更新

我这样做是为了临时解决:

http://laravel.io/bin/5zn58

【问题讨论】:

【参考方案1】:

http://sqlfiddle.com/#!2/d7138/5

SELECT `key`, value FROM portal_user_members pum1
WHERE portal_user_id = 1
AND `key` IN  ('health.profile.sex',
'health.profile.birthday_day',
'health.profile.birthday_month',
'health.profile.birthday_year',
'health.profile.height_ft',
'health.profile.height_in',
'health.profile.weight_lbs',
'health.profile.contact_street_1',
'health.profile.mail_pharmacy_name',
'health.profile.mail_pharmacy_fax',
'health.profile.mail_pharmacy_phone')
AND id = (SELECT MAX(id) 
FROM portal_user_members pum2
WHERE pum2.key = pum1.key)

使用 GROUP BY 的另一个版本。这可能会更快,具体取决于您为表编制索引的方式。 http://sqlfiddle.com/#!2/d7138/9

SELECT pum1.key, pum1.value 
FROM portal_user_members pum1
JOIN (
SELECT `key`, MAX(id) id
FROM portal_user_members pum2
WHERE portal_user_id = 1
AND `key` IN  ('health.profile.sex',
'health.profile.birthday_day',
'health.profile.birthday_month',
'health.profile.birthday_year',
'health.profile.height_ft',
'health.profile.height_in',
'health.profile.weight_lbs',
'health.profile.contact_street_1',
'health.profile.mail_pharmacy_name',
'health.profile.mail_pharmacy_fax',
'health.profile.mail_pharmacy_phone')
GROUP BY pum2.key  
) pum2 ON pum2.id = pum1.id

【讨论】:

你有没有机会知道 Laravel 的 Eloquent 版本? 对不起,我不熟悉 Laravel 或 Eloquent

以上是关于使用 Eloquent 选择具有值的最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章

Eloquent 获取按日期分组的最后一条记录

从具有重复列值的集合中选择第一条记录 C#

Laravel Eloquent - 来自相关数据的多个记录的列值的总和

为每个 ID 选择每个月的最后一条记录

如果数组列中有多条具有相同值的记录 - 取一条具有另一列最小值的记录

如何从具有多个页面的表中获取表记录?