我正试图找出在集合中获取给定模型索引的最佳方法。
场景:属于特定标题的视频列表。标题可以有一个或多个视频。当在手头有Video
模型的给定视频页面上时,我想沿着Video ? of ?
线显示一些内容。
基本上,我需要实现的是反映以下原始sql语句的内容:
SELECT `v`.*
(
SELECT COUNT(`id`)
FROM `videos`
WHERE `title_id` = ?
AND `identity` <= `v`.`identity`
) AS `collection_index`
FROM `videos` `v`
WHERE `v`.`id` = ?
其中,identity
只是用于对视频进行排序的某个字段-可能是数字字段,但也可以是格式为01-03
等的字符串。在上述字段中,collection_index
将存储集合中给定记录的索引(或者更确切地说是顺序位置)。
对Eloquent模型只发表一句话,有人会遇到类似的问题吗?
更新/解决方案
经过@JarekTkaczyk的一些挖掘和帮助,我终于想出了一个解决方案——针对那些可能也面临同样问题的人。下面是我的模型使用子查询来实现上面的内容。
return Video::select('videos.*')
->selectSub("
SELECT COUNT(v.id)
FROM videos as v
WHERE v.title_id = videos.title_id
AND v.identity <= videos.identity
",
'collection_index'
)
->selectSub("
SELECT COUNT(v.id)
FROM videos as v
WHERE v.title_id = videos.title_id
",
'collection_count'
)
->find(id);
希望它能帮助到别人。
我不认为这是Laravel特有的问题。您有一个结果集,其顺序由您的特定条件定义。当您在详细信息页面上时,您的结果集将丢失。你只有详细的记录。
所以,例如,您可能想要缓存列表中每个视频的位置。