为什么当我使用查询构建器而不是函数diffForHumans()时出现错误,但如果我使用ELoquent ROM但没有错误,有办法克服它? (我该如何解决)谢谢
这是 ArticlesController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Article;
use Carbon\Carbon;
use Auth;
use DB;
class ArticlesController extends Controller
{
public function index()
{
$articles =DB::table('articles')->get();
$articles = ['articles'=>$articles];
return view('articles.index',$articles);
}
}
这是模型 Article.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\SoftDeletes;
class Article extends Model
{
//
use SoftDeletes ;
protected $fillable = [
'user_id','content','live','post_on',
];
protected $dates =[
'post_on','deleted_at','created_at','updated_at',
];
public function setLiveAttribute($value)
{
$this->attributes['live'] = (boolean)($value);
}
public function getShortContentAttribute()
{
return substr($this->content,0,random_int(60,150))."...";
}
public function setPostOnAttribute($value)
{
$this->attributes['post_on'] = Carbon::parse($value);
}
public function setCreatedAtAttribute($value)
{
$this->attributes['post_on'] = Carbon::parse($value);
}
}
那是我的代码,我该怎么解决? 谢谢
答案 0 :(得分:8)
我注意到你的一些事情是代码,
created_at
和updated_at
投射到日期,它们已经投放并且是Carbon
$casts
来投放简单的属性,例如live
post_on
日期添加mutator,因为您将其添加到$dates
created_at
而不是post_on
设置了一个mutator,你使用SetCreatedAttribute
而不是setPostOnAttribute
substr($this->content,0,random_int(60,150))."..."
您可以使用Laravel的str_limit
辅助功能,也可以将random_int
更改为rand
=&gt; int rand ( int $min , int $max )
查询构建器将dates
作为字符串返回,您需要在使用它们之前进行解析,否则您将收到类似PHP error: Call to a member function on string
之类的错误,只需这样做:
\Carbon\Carbon::parse(\DB::table('articles')->first()->post_on)->diffForHumans()
你可以让你的模型更简单:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Article extends Model
{
use SoftDeletes ;
protected $fillable = [
'user_id','content','live','post_on',
];
protected $dates = [
'post_on','deleted_at'
];
protected $casts = [
'live' => 'boolean'
];
public function getShortContentAttribute()
{
return str_limit($this->content, rand(60,150));
}
}
您也可以像这样简化index
方法:
public function index()
{
$articles = DB::table('articles')->get();
return view('articles.index', compact('articles'));
}
答案 1 :(得分:5)
默认情况下,eloquent会将date/time
字段作为Carbon
实例返回,而查询构建器则不会。因此,如果要在查询生成器的返回属性上使用Carbon
,则必须使用Carbon::parse()
方法包装该属性。
例如,我可以在一个雄辩的结果中使用Carbon
的方法toCookieString()
之一,例如
echo App\User::find(1)->created_at->toCookieString();
会给出像Thursday, 10-Aug-2017 17:59:53 UTC
这样的回复。但是如果我使用查询构建器而不是
echo DB::table('users')->find(1)->created_at->toCookieString();
然后会出错
在字符串
上调用成员函数toCookieString()
要在此使用Carbon
,我已使用Carbon
的{{1}}方法包装该属性。
parse()
这将给出理想的结果。