Как это исправить Вызов функции-члена 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);
}}

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

5

Решение

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

  • нет необходимости кастовать 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'));
}
7

Другие решения

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

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

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

5

По вопросам рекламы [email protected]