Laravel 分页显示重复和替换随机行

Posted

技术标签:

【中文标题】Laravel 分页显示重复和替换随机行【英文标题】:Laravel pagination showing duplicate and replacing random row 【发布时间】:2017-10-03 12:57:48 【问题描述】:

我正在使用带有分页功能的 laravel 5.4,但我遇到了一个问题,即我的数据库中的一行出现了两次,一次出现在 4 个页面中的两个页面上。当我删除该行时,两者都被删除,但使用该计数的总行数仅显示-1,然后我看到以前隐藏/替换的行。

查看以下数据:

直接来自数据库,查询设置为显示所有这些行 + 查询:

SELECT *  
FROM `faulty_device` 
WHERE `fault_id` = 14 
AND `status` < 3

(粗体在 laravel 中出现两次,而草书根本不显示)

|4254|11383|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4208|10411|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4207|10313|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4206|10229|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03(未显示) |4205|9527|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4204|8538|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4203|8457|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4202|8454|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4201|8402|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4200|6497|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4199|6454|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4198|6384|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4209|24666|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4241|451|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4242|1526|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4253|9879|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4252|9395|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4251|9277|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4250|6074|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4249|6000|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4248|5770|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4247|4962|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4246|4740|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4245|4734|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4244|4704|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4243|2824|14|NULL|XXXXXXXXXX|1|NULL|2017-05-05 07:07:43 |4197|3910|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4196|3470|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03(出现两次) |4195|3357|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4155|2380|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4121|7766|14|NULL|XXXXXXXXXX|1|NULL|2017-05-02 09:43:29 |4120|7561|14|NULL|XXXXXXXXXX|1|NULL|2017-05-02 09:43:29 |4119|7318|14|NULL|XXXXXXXXXX|1|NULL|2017-05-02 09:43:29 |4118|7276|14|8|XXXXXXXXXX|2|NULL|2017-05-02 09:43:29 |4117|6782|14|NULL|XXXXXXXXXX|1|NULL|2017-05-02 09:43:29 |4116|6571|14|NULL|XXXXXXXXXX|1|NULL|2017-05-02 09:43:29 |4115|5713|14|NULL|XXXXXXXXXX|1|NULL|2017-05-02 09:43:29 |4112|4603|14|NULL|XXXXXXXXXX|1|NULL|2017-05-02 09:43:29 |4110|3633|14|NULL|XXXXXXXXXX|1|NULL|2017-05-02 09:43:29 |4106|2805|14|NULL|XXXXXXXXXX|1|NULL|2017-05-02 09:43:29 |4158|4515|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4159|5627|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4160|5628|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4194|2858|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4193|1536|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4192|849|14|NULL|XXXXXXXXXX|1|NULL|2017-05-04 07:16:03 |4168|24642|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4167|10559|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4166|10439|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4165|10142|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4164|10114|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4163|8777|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4162|8513|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |4161|7450|14|NULL|XXXXXXXXXX|1|NULL|2017-05-03 06:55:48 |2933|6841|14|NULL|XXXXXXXXXX|1|NULL|2017-04-08 10:55:36

基本上显示两次的行会删除未显示的行。当我将该行的状态手动更改为 3 或以上时(不包括在查询中不会显示)显示两次的行,先前隐藏的行再次显示。就像这个复制品是一个charmelion,只是随机占用某人的位置..

Laravel 分页呈现数据+查询: (我知道这可以看起来更漂亮,但它应该做同样的事情实际上是因为如果我在这里使用计数,它将显示 55 行,就像我在上面做了计数一样)

$faultyDevices = FaultyDevice::
where('status', '!=', '3')
->where('status', '!=', '4')
->where('status', '!=', '5')
->where('status', '!=', '6')
->where('status', '!=', '7')
->orderBy('created_at', 'asc')
->paginate(18, ['*'], 'faults_page');

下面是一个最大为 60 的分页,因此所有行都显示在一页上,而不是拆分为 4。这里它正确显示了所有行,就像在数据库中执行原始 SQL 时一样:

任何想法如何解决?这肯定是一个错误,而不是我的错误代码?

【问题讨论】:

【参考方案1】:

这是因为有许多记录具有相同的created_at 值。要解决此问题,请按 id 添加第二个顺序以删除分页中的重复节目:

$faultyDevices = FaultyDevice::
    where('status', '!=', '3')
    ->where('status', '!=', '4')
    ->where('status', '!=', '5')
    ->where('status', '!=', '6')
    ->where('status', '!=', '7')
    ->orderBy('created_at', 'asc')
    ->orderBy('id', 'asc')
    ->paginate(18, ['*'], 'faults_page');

【讨论】:

这听起来很可能。我认为无论 created_at 值是否相同,laravel 不应该根据页面进行不同的排序,但我知道这可能是问题所在。由于没有人知道这一点,因此我已经交换以在另一个与 jquery 一起使用的数据表中显示数据,因此问题不再出现 - 所以我无法确认。但同样,听起来很有可能! 该命令与laravel无关,与数据库引擎有关***.com/questions/6662837/… 明白了。不会想到没有内置方法可以始终以相同的顺序显示项目,即使它们在订单上是相同的。谢谢! 这也解决了我的分页结果中出现的重复项。【参考方案2】:

为避免显示重复,请在查询中添加distinct() 子句:

$faultyDevices = FaultyDevice
    ::distinct()
    ->where('status', '<>', 3)
    ->where('status', '<>', 4)
    ->where('status', '<>', 5)
    ->where('status', '<>', 6)
    ->where('status', '<>', 7)
    ->orderBy('created_at', 'asc')
    ->paginate(18, ['*'], 'faults_page');

【讨论】:

恐怕这不是问题。请仔细查看问题。数据库中没有重复项,因此在不同页面上显示相同的项目是相当.. 奇怪的。如果我将所有行都显示在一个较大的页面上(分页 60 等而不是 18),它不会显示该项目两次。【参考方案3】:

您确定在您点击更改页面时表格没有更新吗?基本上,Laravel 只是计算完整搜索的行数,并根据该数字和您要显示的页面设置 offsetlimit。工作的那部分不能有错误。

但是,如果在打印分页后插入了一些新行,那么当您导航到下一页时,您看到上一页中的行。这是正常的,除非基于id 而不是count() 行创建新的分页系统,否则无法避免这种情况

【讨论】:

我确定。 Laravel 在拆分页面之前做得很好。正如你所看到的,laravel 分页是由创建的 at 排序的,因此新的插入永远不会出现在中间——尽管如此,我已经把它移到了我的测试环境中,没有新的插入,即使它确实插入了,插入本身是独特。我们称之为相同的“设备”永远不会有两个具有相同状态的列表,因此永远不会发生重复。查看提供的两张图片,你会发现它们是不同的,即使是相同的数据,甚至是相同的 laravel 查询。

以上是关于Laravel 分页显示重复和替换随机行的主要内容,如果未能解决你的问题,请参考以下文章

laravel 仅在分页中显示下一个和上一个链接

Laravel 5.4 分页链接未显示在视图中

如何在 vue 组件上显示分页 laravel?

Laravel 自定义分页可以调整显示数目

如何获得随机行 laravel-5

Laravel 5.3,用图片替换分页链接(<< 和 >>)