web-dev-qa-db-ja.com

Laravel Eloquent modelに常に属性を追加する方法は?

投稿フォームデータベースを取得するときなどに、データを要求せずにEloquentモデルに常にデータを追加する方法を考えていました。各ユーザーのユーザー情報を次のように追加します。

{
    id: 1
    title: "My Post Title"
    body: "Some text"
    created_at: "2-28-2016"
    user:{
            id: 1,
            name: "john smith",
            email: "[email protected]"
         }
}
15
Mustafa Dwekat

いくつか検索したところ、Eloquentモデルの$appends配列に必要な属性を追加するだけでよいことがわかりました。

 protected $appends = ['user'];

更新:属性がデータベースに存在する場合、以下の David Barker's コメントに従ってprotected $with= ['user'];を使用できます

次に、以下のようにアクセサを作成します。

public function getUserAttribute()
{

    return $this->user();

}

このようにして、常に各投稿のユーザーオブジェクトを次のように使用できます。

{
    id: 1
    title: "My Post Title"
    body: "Some text"
    created_at: "2-28-2016"
    user:{
            id: 1,
            name: "john smith",
            email: "[email protected]"
         }
}
18
Mustafa Dwekat

このコンセプトは面白いと思い、学び、共有しました。この例では、このロジックによってメソッドに変換されるid_hash変数を追加しています。最初の文字を受け取り、大文字に変換します。つまり、Idとアンダースコアの後の文字を大文字に変換します。つまり、ハッシュです。

Laravel自体にgetAttributeを追加してすべてを結合すると、getIdHashAttribute()が得られます

class ProductDetail extends Model
{
    protected $fillable = ['product_id','attributes','discount','stock','price','images'];
    protected $appends = ['id_hash'];


    public function productInfo()
    {
        return $this->hasOne('App\Product','id','product_id');
    }

    public function getIdHashAttribute(){
        return Crypt::encrypt($this->product_id);
    }
}

物事を簡単にするために変数を追加すると次のようになります

protected $appends = ['id_hash','test_var'];

メソッドはこのようにモデルで定義されます

 public function getTestVarAttribute(){
        return "Hello world!";
    }
0
Hemant Kumar