2016-07-27 64 views
2

Laravel日期改变我正在写一个范围查询,我传递一个fetch_date从基础上created_at时间戳DB表拉东西。当我更新变量

我试图寻找了一个月的所有记录,但变量$fetch_date不断变化,每当我尝试以下方法:

//$fetch_date is a carbon instance and is equal to the month the user selected 
    //ie: Carbon {#221 ▼ 
    // +"date": "2016-07-01 00:00:00.000000" 

    //Create the next_month 
    $next_month = $fetch_date->addMonth(); 
    //Format next_month as a string 
    $next_month = $next_month->format('Y-m-d'); 
    //Format fetch_date as a string 
    $fetch_date = $fetch_date->format('Y-m-d'); 

    dd($fetch_date); 
    //This now gives me 2016-08-01 - why? 

为什么会出现fetch_date变化?我基本上试图保持$fetch_date当前月份和$next_month仅仅是下个月的开始。

我猜有一个真正的原因很简单,这个我只是远眺。

+0

我想一个月要添加到fetch_date变量。尝试复制它,然后添加月份。 –

回答

1

因为调用addMonth方法有副作用。

如果你看一下碳的source,你会看到所有addMonth正在做的是调用addMonths为1的值,而这又是简单地调用DateTime::modify。它没有明确的文档中阐明,但是从实施例它是非常普通的,在调用该方法修改所存储的时间值:

实施例#1的DateTime ::修改()的例子

<?php 
$date = new DateTime('2006-12-12'); 
$date->modify('+1 day'); 
echo $date->format('Y-m-d'); 
?> 

为了避免这种情况,保留的副本的时候周围和修改:

$also_fetch_date = clone $fetch_date; 
$next_month = $also_fetch_date->addMonth(); 
// ... 
+0

有趣的 - 并解释到底是什么继续。感谢您的详细解释;现在我明白了,你的纠正解决了这个问题。 – Hanny

+1

嗯,为什么要添加月/克隆对象,当你可以简单地使用php的strtotime来达到预期的效果。另外,也可以在Carbon中使用' - > copy'方法在一行中完成。 –

0

好像每个月要添加到fetch_date变量。

试试这个:

$next_month = Carbon::createFromFormat('Y-m-d', $fetch_date->format('Y-m-d')); 
$next_month->addMonth(); 

dd($next_month->format('Y-m-d')); 

在碳的文档看看:http://carbon.nesbot.com/docs/ 也许会帮助你

+0

好吧,我试过了。对于某些*疯狂*的原因,即使将其更改为您在此处完成的操作后,$ fetch_date仍会发生变化。 我想知道如果也许我的浏览器没有缓存奇怪的东西 - 因为我不知道它是如何可能的... – Hanny

+0

尝试新的解决方案,创建一个新的碳对象名为next_month –