web-dev-qa-db-ja.com

修正方法laravel 5.3の文字列でメンバー関数diffForHumans()を呼び出す

代わりにクエリビルダーを使用すると、関数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
Raka Hikmah

私はあなたのコードにいくつかのことに気づきました、

  • _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'));
}
_
9
yoeunes

デフォルトでは、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を使用するために、プロパティをCarbonparse()メソッドでラップしました。

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

これにより、雄弁な結果が得られます。

5
Sazzadur Rahman