Laravel where() returns 对象而不是数组

Laravel where() returns object instead of array

Eloquent 的新手,关于方法的 return 值有一个令人费解的问题。 when() 方法对于三个几乎相同的过滤器中的两个按预期工作,但第三个 return 是格式不同的结果集。

我能够使用 when() 方法将结果集合过滤到两个单独的对象数组中。但是在同一个集合 return 上使用的第三个相同的过滤器($pastBooks)是一个索引对象而不是对象数组。数据库中的所有数据都是标准化的,并使用相同的碳日期格式。我很困惑,如果有任何帮助,我将不胜感激。

$bookings = Booking::leftJoin('classes', 'bookings.class_id', '=', 'classes.class_id')
                        ->leftJoin('users', 'bookings.user_id', '=', 'users.id')
                        ->get(['bookings.booking_id', 'users.name','classes.class_id',
                               'classes.class_name', 'classes.class_date', 'users.phone','users.email']);  

$todayBook = $bookings->where('class_date', \Carbon\Carbon::today());

$thisWeekBooks = $bookings->where('class_date', '>', \Carbon\Carbon::today());

$pastBooks  = $bookings->where('class_date', '<', \Carbon\Carbon::today());

return(['today' => $todayBook, 'past' => $pastBooks,'thisWeekBooks' => $thisWeek]);

//Results

 {
 today: [ ],
 past: {
 11: {
 booking_id: 220,
 name: "trial",
 class_id: 8,
 class_name: "Intermediate",
 class_date: "2020-11-30 21:47:23",
 phone: 12356789,
 email: "trial@gmail.com"
 },
 12: {
 booking_id: 212,
 name: "trial",
 class_id: 9,
 class_name: "one-to-one",
 class_date: "2020-12-30 21:47:23",
 phone: 12356789,
 email: "trial@gmail.com"
  },
 13: {
 booking_id: 213,
 name: "trial",
 class_id: 9,
 class_name: "one-to-one",
 class_date: "2020-12-30 21:47:23",
 phone: 12356789,
 email: "trial@gmail.com"
 }
 },
 thisWeek: [
 {
 booking_id: 207,
 name: "trial",
 class_id: 7,
 class_name: "beginner",
 class_date: "2021-02-17 21:47:23",
 phone: 12356789,
 email: "trial@gmail.com"
 },
 {
 booking_id: 208,
 name: "trial",
 class_id: 7,
 class_name: "beginner",
 class_date: "2021-02-17 21:47:23",
 phone: 12356789,
 email: "trial@gmail.com"
 }
 ]
 }

它们都返回相同的东西,您只是看到了由于 JSON 转换而有所不同。

JSON 数组仅支持适当的数字、从 0 开始、顺序索引的数组。如果索引不是数字、不是从 0 开始或不是连续的,则数组将表示为 object.

你的数据基本上是这样的:

[
    'today' => [ ],
    'past' => [
        11 => Object11,
        12 => Object11,
        13 => Object11,
    ],
    'thisWeek' => [
        0 => Object0,
        1 => Object1,
    ],
]

由于您的 thisWeek collection 的键是数字的、基于 0 的顺序键,JSON 可以将其表示为 object 的数组。但是,尽管 past collection 中的键是数字和顺序的,但它们不是从 0 开始的,因此该数组将表示为具有数字属性的 object。

您可以在 collection 上使用 values() 方法使用基于数字 0 的顺序键重新输入 collection。

return([
    'today' => $todayBook->values(),
    'past' => $pastBooks->values(),
    'thisWeek' => $thisWeek->values(),
]);

据我所知get函数必须在最后

点赞

$bookings = Booking::leftJoin('classes', 'bookings.class_id', '=', 'classes.class_id')->leftJoin('users', 'bookings.user_id', '=', 'users.id')->get(['bookings.booking_id', 'users.name','classes.class_id', 'classes.class_name', 'classes.class_date', 'users.phone','users.email']);  

$todayBook = $bookings->where('class_date', \Carbon\Carbon::today());

至此

$bookings = Booking::leftJoin('classes', 'bookings.class_id', '=', 'classes.class_id')->leftJoin('users', 'bookings.user_id', '=', 'users.id');  

$todayBook = $bookings->where('class_date', \Carbon\Carbon::today())->get(['bookings.booking_id', 'users.name','classes.class_id', 'classes.class_name', 'classes.class_date', 'users.phone','users.email']);