2015-12-14 138 views
2

让我的表设置时间戳字段用于在字段中创建和更新。Laravel日期不允许我使用diffForHumans

在我的模型然后我做到这一点:

protected $dates = ['created_at', 'updated_at']; 

但调用的日期:

$p->created_at->diffForHumans() 

我得到

Call to a member function diffForHumans() on string 

我敢肯定,应该工作。我曾经在不同的模型等使用过相同的许多次,但这是行不通的。

+1

你其实并不需要列出'created_at'和'updated_at'在'$ dates'财产。 Laravel已经在幕后为你处理这件事。无论如何,你是否可能改变或铸造属性? –

+0

或者使用非雄辩模型查询获取记录? DB ::语句可能不会转换这些值。 –

回答

0

你必须使用Carbon,像这样:

$date = new \Carbon($p->created_at)->diffForHumans(); 
+2

默认情况下,'Eloquent'将'$ dates'中的日期属性转换为'Carbon',所以它应该使用'$ p-> created_at-> diffForHumans()'来工作,因为'created_at'可以在'$ dates'属性中获得这些假设是'碳'instaan​​ces。 –

4

默认情况下,雄辩会转换created_at和的updated_at到碳,它提供了有用的方法各式各样的实例列,并扩展了原生PHP的DateTime类。

阅读:https://laravel.com/docs/5.1/eloquent-mutators#date-mutators

只是检查nesbot /炭包你composer.json文件。在情况下,如果你没有,你可以通过键入

composer require nesbot/carbon 

替代的解决方案是安装它,

你可以使用碳::解析()来动态地创建对象。

Carbon::parse($p->created_at)->diffForHumans(); 
5

我在5.2版本已经使用了Laravel diffForHumans()功能,只有当您使用的是created_atupdated_at工作,否则会带来你的Call to a member function diffForHumans() on string错误。即使你已经使用了created_atupdated_at,只要确定你的迁移,你还没有使用:

$table->timestamp('created_at'); 
$table->timestamp('updated_at'); 

但你有没有根据laravel 差异使用

$table->timestamps(); 

但由于某种原因,您想对某个既不是created_atupdated_at,的列使用diffForHumans()函数。例如expired_at,使用碳

我可以总结说的是:

  1. 首先创建一个新的文件夹可以被称为在laravel项目文件夹如测试laravel Addon
  2. 那么文件夹内,您创建一个名为Carbon.php的新文件。
  3. 里面的Carbon.php文件,输入:

namespace Carbon; 

class Carbon extends \DateTime{ 
    // 
} 

然后转到您的控制器ProductController.php和碳命名空间添加到文件:


namespace Addon; 
namespace App\Http\Controllers; 

use Carbon\Carbon; 
use ... 

class ProductController extends Controller{ 
    $expire_date_string = '2016-07-27 12:45:32'; 
    // Parse date with carbon 
    $carbonated_date = Carbon::parse($expire_date_string); 
    // Assuming today was 2016-07-27 12:45:32 
    $diff_date = $carbonated_date->diffForHumans(Carbon::now()); 
    echo $diff_date; // prints "1 month after" 
} 

有关Ca的更多信息rbon控制器,请访问:http://carbon.nesbot.com/docs/

2

你并不需要使用碳一列既不created_at和的updated_at就像expired_at添加新列到你的模型:

/** 
* The attributes that should be mutated to dates. 
* 
* @var array 
*/ 
protected $dates = [ 
    'created_at', 
    'updated_at', 
    'deleted_at', 
    'expired_at' 
]; 

然后你就可以使用 - > diffForHumans();

https://laravel.com/docs/5.3/eloquent-mutators#date-mutators