代わりにクエリビルダーを使用すると、関数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))."..."
の代わりにLaravelの_str_limit
_ヘルパー関数を使用できます。また、_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'));
}
_
デフォルトでは、eloquentは_date/time
_フィールドをCarbon
インスタンスとして返しますが、クエリビルダーは返しません。したがって、クエリビルダーから返されたプロパティでCarbon
を使用する場合は、プロパティをCarbon::parse()
メソッドでラップする必要があります。
たとえば、次のような雄弁な結果に対して、Carbon
のメソッドtoCookieString()
の1つを使用できます。
_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
のparse()
メソッドでラップしました。
_echo Carbon\Carbon::parse(DB::table('users')->find(1)->created_at)->toCookieString();
_
これにより、雄弁な結果が得られます。