【问题标题】:Laravel Eloquent WhereBetween with Comma Delimited Timestamps?Laravel Eloquent WhereBetween 用逗号分隔的时间戳?
【发布时间】:2019-03-14 09:47:13
【问题描述】:



鉴于上图......使用 Laravel 的 Eloquent - 我如何查找特定日期范围以返回该范围内的行?

我知道 Laravel 有一个 whereBetween 函数可以处理传统的日期字段,但由于这些是时间戳,我意识到我必须使用类似于 where('dates', '>=', $startTimestamp)where('dates', '<=', $endTimestamp) 的东西,但我也必须这是否适用于从列中展开的每个日期?

感谢大家的帮助!

【问题讨论】:

  • 我认为你的数据库建错了...
  • 您的日期列的数据类型是什么?
  • 在文本字段中以 CSV 格式显示日期可能是错误的方法。您可能想研究使用某种数据透视表或 JSON 列。就目前而言,您将很难根据该列获取特定记录,特别是如果您要依赖 php 的 explode() 函数;需要先获取每条记录,然后才能过滤它们。
  • 我使用了一个 jquery datepicker,它以 JSON 格式读取这种格式,这就是我最初采用保存分隔时间戳的方法的原因。
  • 您应该为数据库中的每个单独的值使用原生 datetimetimestamp 类型。否则,您还将无法访问用于查询此类列的所有有用方法,并且本机函数将(到目前为止)降低性能。在 PHP 中进行拆分比您以后继续使用此模式设计时所做的工作要少得多。至少在我看来,即使像您建议的那样创建视图也比更改架构更费力。

标签: php mysql laravel date eloquent


【解决方案1】:

尽管它可能是糟糕的数据库设置,但有时必须按照当前的方式完成 - 出于业务原因或迟到或其他原因;一个难看的修复可能比全面大修更好 - 特别是在系统很小并且将保持很小的情况下,不需要过度考虑处理速度。

这是对所提出问题的解决方案,利用 MySQL 表连接,从该连接响应中进行选择。这也是用 Laravel 编写的,因此是 DB 静态函数。

$temp = DB::select(DB::raw("select
  leave_entries.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(leave_entries.dates, ',', numbers.n), ',', -1) dates
  from
  (select 1 n union all
   select 2 union all select 3 union all
   select 4 union all select 5) numbers INNER JOIN leave_entries
  on CHAR_LENGTH(leave_entries.dates)
     -CHAR_LENGTH(REPLACE(leave_entries.dates, ',', ''))>=numbers.n-1
     where uid = {$uid}
     AND dates >= {$start_timestamp} 
     AND dates <= {$end_timestamp}
  order by
  id, n"));

// Return the resulting table:
dd($temp);

将其留在这里而不是删除问题,因为它可能对某人有所帮助。

未来的人:在你的情况下 - 如果你可以重做数据库架构,正如我的问题所建议的那样,那么就这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多