1

Ardent を使用していますが、関連モデルの挿入/更新中に $fillable リストを無視するという奇妙な動作に直面しました。次のモデルが定義されています。

class User extends LaravelBook\Ardent\Ardent
{
    protected $table = 'users';

    public static $relationsData = [
        'contacts' => [self::HAS_MANY, 'Contact'],
    ];    
}

class Contact extends LaravelBook\Ardent\Ardent 
{
    protected $table    = 'user_contacts';
    protected $guarded  = ['*'];
    protected $fillable = [
        'user_id',
        'type',
        'value'
    ];

    public static $relationsData = [
         'user' => [self::BELONGS_TO, 'User'],
    ];
}

今、私はユーザーに新しい連絡先を追加しようとしています:

    $user->contacts()->create([
    'type' => 'some type',
    'value' => 'some value',
    'unknown_field' => 'unknown value'
]);

...そして、SQL挿入エラーが発生しました:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'unknown_field' in 'field list'     (SQL: insert into `user_contacts` (`type`, `value`, `unknown_field`, `user_id`, `updated_at`, `created_at`) values (?, ?, ?, ?, ?, ?)) (Bindings: array ( 0 => 'some type', 1 => 'some value', 2 => 'unknown value', 3 => 2, 4 => '1384854899', 5 => '1384854899', ))

同時に、これは正常に機能しています:

UserContact::create([
    'user_id'       => 2,
    'type'          => 'some type',
    'value'         => 'some value',
    'unknown_field' => 'unknown value'
]); 

SQL エラーは発生せず、「unknown_field」は無視されました。

ビルダーを介して作業しているときに $fillable フィールドを無視できる理由はありますか?!

4

6 に答える 6

3

HasManyOrOne 関係が意図的に fillable を無視する理由がわかりません。それは本当に直感に反するようです。いずれにせよ、これはあなたのために働くべきだと思います。

$user->contacts()->save(Contact::create([ ... ]));
于 2013-11-19T15:00:31.523 に答える
0

protected $guarded = array();の代わりに使用protected $guarded = ['*'];

を使用[*]することで、すべてのエンティティをオートハイドレーション/質量割り当てから保護するようlaravelに指示しています!

array()この$guardedリストを null に設定します。

fillable プロパティは、どの属性を一括割り当て可能にするかを指定します。これは、クラスまたはインスタンス レベルで設定できます。

fillable の逆は保護され、「ホワイトリスト」ではなく「ブラックリスト」として機能します。

質量割り当てに関する Laravel ドキュメントで詳細を読む

于 2014-08-29T04:40:24.247 に答える
0

公式ドキュメントに記載されているように:

開始するには、モデルに入力可能または保護されたプロパティを設定します。

両方を設定しました。次の行を削除する必要があります。protected $guarded = ['*'];

于 2013-11-19T13:20:02.543 に答える
0

更新メソッドはモデル レベルではなく、$fillable フィールドを尊重しません。

Input::only['fillable fields here'] を使用して、入力データをフィルタリングできます。

于 2015-07-22T22:56:11.817 に答える
0

幸い、これはバージョン 4.2 で修正される予定です: https://github.com/laravel/framework/pull/2846

これらすべてに加えて、属性を手動でフィルタリングすることもできます。

$input = [
    'user_id'       => 2,
    'type'          => 'some type',
    'value'         => 'some value',
    'unknown_field' => 'unknown value'
];

$fillable = $user->contacts()->getRelated()->fillableFromArray($input);

$user->contacts()->create($fillable);

この例では、保護されているメソッドを使用しているEloquent\Model\fillableFromArray()ため、たとえば複製する必要があることに注意してください。

class BaseModel extends Eloquent 
{
    public function fillableFromArray(array $attributes)
    {
        return parent::fillableFromArray($attributes);
    }
}
于 2014-02-27T15:42:09.567 に答える