Как это исправить Вызов функции-члена diffForHumans() для строки в laravel 5.3

Почему, когда я использую построитель запросов вместо этого, возникает ошибка в функции 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);
    }



}

и это мой код, как я могу это исправить? благодарю вас


person Raka Hikmah    schedule 10.08.2017    source источник


Ответы (2)


я заметил пару вещей в вашем коде,

  • нет необходимости приводить created_at и updated_at к датам, они уже приведены и являются экземплярами Carbon
  • вы можете использовать свойство $casts для приведения простых атрибутов, таких как live
  • нет необходимости добавлять мутатор для post_on даты, потому что вы добавляете его в $dates
  • также вы устанавливаете мутатор на created_at вместо post_on, вы используете SetCreatedAttribute вместо setPostOnAttribute
  • вместо substr($this->content,0,random_int(60,150))."..." вы можете использовать вспомогательную функцию str_limit Laravel, также измените random_int на rand => 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'));
}
person yoeunes    schedule 10.08.2017
comment
о, спасибо, это хорошее предложение, и когда я пробую ваши предложения, оно работает - person Raka Hikmah; 11.08.2017

По умолчанию красноречивый возвращает 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 здесь, я обернул свойство методом parse() Carbon.

echo Carbon\Carbon::parse(DB::table('users')->find(1)->created_at)->toCookieString();

Это даст желаемый результат, как красноречиво.

person Sazzadur Rahman    schedule 10.08.2017