Php 如何将项目推送到laravel查询中的数组?
我有几个正在运行的查询,我需要能够将项推送到数组中,然后将数组项分配到该对象上的更新查询中。以下是该功能背后的理念以及我认为它应该是什么:Php 如何将项目推送到laravel查询中的数组?,php,mysql,arrays,json,laravel,Php,Mysql,Arrays,Json,Laravel,我有几个正在运行的查询,我需要能够将项推送到数组中,然后将数组项分配到该对象上的更新查询中。以下是该功能背后的理念以及我认为它应该是什么: "offer_when”: [ { “when”: “later”, "offer_end_time": "19:00", "offer_start_time": "17:00" }, { “when”: “tomorrow”, "offer_e
"offer_when”: [
{
“when”: “later”,
"offer_end_time": "19:00",
"offer_start_time": "17:00"
},
{
“when”: “tomorrow”,
"offer_end_time": "18:00",
"offer_start_time": "17:00"
}
]
我们的想法是,在更新offer_when object时,我们不只是添加一个对象,而是根据某些条件添加尽可能多的对象,例如:
- 如果报价日是明天
- 如果报价日开始时间晚于当前时间 等
public function getOffers(Offer $offer)
{
$mytime = Carbon::now('Europe/London');
$currentTime = $mytime->format('H:i');
$today = $mytime->format('m/d/Y');
$day = $mytime->format('l');
$tomorrow = Carbon::now()->addDay(1)->format('l');
$thisDay = strtolower($day);
DB::table('offers')->update(['current_time' => $currentTime]);
DB::table('offers')->update(['current_date' => $today]);
DB::table('offers')->update(['current_day' => $thisDay]);
foreach(Offer::all() as $offerObject){
$when = $offerObject['offer_when'];
$the_days = $offerObject['days'];
$featured = $offerObject['current_date'];
$featured_date = $offerObject['featured_date'];
$start_time = $offerObject['offer_start_time'];
$current_time = $offerObject['current_time'];
$end_time = $offerObject['offer_end_time'];
$whens = array();
$whenDataTomorow =
[
array(
'when' => 'tomorrow',
'start_time' => $start_time,
'end_time' => $end_time
)
];
$whenDataNow =
[
array(
'when' => 'now',
'start_time' => $start_time,
'end_time' => $end_time
)
];
$whenDataLater =
[
array(
'when' => 'later',
'start_time' => $start_time,
'end_time' => $end_time
)
];
$isTomorrow = json_encode($whenDataTomorow);
$isNow = json_encode($whenDataNow);
$isLater = json_encode($whenDataLater);
$offerObject::where('days', 'LIKE', '%' . strtolower($tomorrow) . '%')
->update(['offer_when' => $isTomorrow]);
$offerObject::where('days', 'LIKE', '%' . $thisDay . '%')
->where('current_time', '>', $start_time)
->update(['offer_when' => $isNow]);
$offerObject::where('days', 'LIKE', '%' . $thisDay . '%')
->where('offer_start_time', '>', $current_time)
->update(['offer_when' => $isLater]);
$offerObject::whereBetween('offer_start_time', array('07:00','12:00'))
->update(['types' => 'breakfast']);
$offerObject::whereBetween('offer_start_time', array('11:00','14:00'))
->update(['types' => 'lunch']);
$offerObject::whereBetween('offer_start_time', array('14:00','21:00'))
->update(['types' => 'dinner']);
$offersAll = $offerObject
::where('days', 'LIKE', '%' . $thisDay . '%')
->orWhere('days', 'LIKE', '%' . strtolower($tomorrow) . '%')
->orWhere('featured_date', 'LIKE', '%' . $featured . '%')
->get();
return $offersAll;
}
}
上面的查询是有效的,我在输出中得到了一些东西,它似乎选择了正确的值,但我需要这样做,因为有些报价属于相同的查询。这是一个产品的输出:
"offer_when": [
{
"when": "now",
"start_time": "08:50",
"end_time": "08:50"
}
],
但是这个object字段应该有两个子对象,但是我不能让查询按照我希望的方式正确地执行。有人能给我指出正确的方向吗?当您使用
$model->update()
时,它会覆盖当前值。所以你永远不会有多个孩子
首先,不要使用json\u encode()
存储数组。使用
现在您可以将$offer->offer\u(当时)视为一个数组。请注意,当[0]=1
时,不能像$offer->offer\u那样直接修改属性值,这是不可能的,系统将抛出异常。您必须获取当前值、操纵并重新分配给该属性
$offerWhen = $offer->offer_when;
// Add
$offerWhen[] = [
'when' => 'now',
'start_time' => $start_time,
'end_time' => $end_time,
];
// Remove
unset($offerWhen[0]);
// Finish? Assign back to the attribute
$offer->offer_when = $offerWhen;
$offer->save();
// Or this also works
$offer->update(['offer_when' => $offerWhen]);
我建议使用when
字段作为键,以便于访问和操作
// Add
$offerWhen['now'] = [
'when' => 'now',
'start_time' => $start_time,
'end_time' => $end_time,
];
// Remove
unset($offerWhen['now']);
// Add
$offerWhen['now'] = [
'when' => 'now',
'start_time' => $start_time,
'end_time' => $end_time,
];
// Remove
unset($offerWhen['now']);