如何修复它在laravel 5.3

时间:2017-08-10 17:46:17

标签: php laravel laravel-5.3 mutators

为什么当我使用查询构建器而不是函数diffForHumans()时出现错误,但如果我使用ELoquent ROM但没有错误,有办法克服它? (我该如何解决)谢谢

diffForHumans()

这是 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);
    }



}

那是我的代码,我该怎么解决? 谢谢

2 个答案:

答案 0 :(得分:8)

我注意到你的一些事情是代码,

  • 无需将created_atupdated_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()

这将给出理想的结果。