从数据库中获取两个日期之间的Laravel 5和Eloquent数据

5

我是一个Laravel 5的初学者。我有一张名为users的表,其中包含CreateDate、Type和Channel三列。

我有一个用户列表,我在视图中选择了Trans StartDate、Trans EndDate、Type和Channel。

我想要展示:Tras StartDate < CreateDate < Trans EndDate,以及Type和Channel。name="time_start", "time_end", "type", "channel"

我的路由:

Route::post('user', 'CSKHController@index');

我的控制器:

public function index() {

    $start = Input::get ( 'time_start' );
    $end = Input::get ( 'time_end' );      

    $articles = KhachHang::all()->whereBetween('CreateDate', [$start, $end])->get();

    return view('admin/layouts/test', compact('stt','article'))->withDetails($articles);

}

请帮助我!


你有什么问题吗?请更具体地描述并告诉我们您的问题所在以及您已经做了哪些尝试来解决它。 - Andreas
我想展示数据如下:交易开始日期 < 创建日期 < 交易结束日期,带有类型和渠道。我尝试使用我的代码,但它没有正确运行。 - Vũ Hưng
什么是KhachHang?这个模型有一个CreateDate属性吗? - Laerte
我有一个名为KhachHang的模型:class KhachHang extends Model { protected $table = 'users'; - Vũ Hưng
4个回答

6

Laravel 5.*

这是我在 Laravel 5.6 项目中使用 Eloquent between 的示例。

my-view.blade.php

简化的 HTML 表单:

<form action="my-route" method="POST">

    {{ csrf_field() }}

    <input type="date" name="from">

    <input type="date" name="to">

    <button type="submit">Submit</button>

</form>

MyController.php

use Illuminate\Support\Carbon;

// ...

$request->validate([

    'from'        => 'required|date',
    'to'          => 'required|date',
]);

$from    = Carbon::parse($request->from)
                 ->startOfDay()        // 2018-09-29 00:00:00.000000
                 ->toDateTimeString(); // 2018-09-29 00:00:00

$to      = Carbon::parse($request->to)
                 ->endOfDay()          // 2018-09-29 23:59:59.000000
                 ->toDateTimeString(); // 2018-09-29 23:59:59

$models  = Model::whereBetween('created_at', [$from, $to])->get();

// do whatever you want with the query results...

额外资源

使用 whereBetween 进行日期范围查询

将 Carbon 日期转换为 MySQL 时间戳


3

要在两个日期之间进行检查,您可以使用以下内容(除其他选项外):

$articles = KhachHang::where('CreateDate', '>=', $start)
                     ->where('CreateDate', '<=', $end)->get();

您必须确保日期格式为'Y-m-d',否则代码将无法正常运行。


2
应该使用 whereBetween()。这也是它存在的全部原因。 - jonlink
@jonlink 当我收集条件时(name like 'hello' and date between '2018-01-01' and '2018-03-01'),我不能混合使用 wherewhereBetween - flaschenpost
@flaschenpost 当然可以 :) 我经常做这样的事情。我不确定你正在做什么,你想要实现什么,以及哪些方面出了问题,但你绝对可以在whereBetween()where()一起使用。 - jonlink
@flaschenpost 例如 MyClass::whereBetween('created_at', [$start, $end])->where('name', 'LIKE', '%hello%')->toSql() 返回 "select * from my_class where created_at between ? and ? and name LIKE ?",这正是我期望得到的。因此,如果我执行 MyClass::whereBetween('created_at', [$start, $end])->where('name', 'LIKE', '%hello%')->get(),将返回预期的结果。 - jonlink
谢谢,那是正确的。但我无法将它与 if 混合使用。我像这样写:'if (...name...){$co[] = [name,=,$n;]} if (...date...){ $co[] = [ ... date ...];}` 然后将 $co 放入 where() 中。但你是对的,似乎有一种方法可以在其中使用 if() 连接。 - flaschenpost

2

虽然这是一个老问题,但答案并不完美。使用 whereBetween() 函数,它至少从5.0版本就存在了,详见文档

$articles = KhachHang::whereBetween('CreateDate', [$start, $end])->get();


2
只需将此代码添加到您的Eloquent查询中即可。 ->whereBetween('your_field', [$from, $to])->get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接