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']);
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']);