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