Burhan T. 2 dakikalık okuma
May 8, 2018

Laravel Mass Assignment Mevzusu...

Laravel’de active record kullanırken yani eloquent, toplu olarak veritabanına veri ekleme ihtiyacı duyabiliriz. Bunun içinde:

Aşağıdaki gibi modelimize “create” statik metodunu yapıştırarak yaparız.

// Create a new user in the database...

$user = User::create(['name' => 'Remzi','email'=>'ramo@gmail.com','tel'=>'0322 7566 523']);

ya da

$user = new User(Input::all());

gibi. Bu güncelleme de olabilir Şöyle:

User::where('id',12)->update($data);

Burada mass assignment güvenliğinin uygulanması devreye girecektir. Model içerisinde fillable ve guarded alanlar göz önüne alınarak Laravel işlem yapacaktır.

Örnekteki alanları hatasız veritabanına yazdırabilmemiz için modelimiz içerisinde kullandığımız name, email, tel gibi alanları dokunabilir yapmalıyız. Bunun için hangi alanları değiştirmek istersek fillable içerisinde yer alması gerek.

class User extends Model {

    protected $fillable = ['name', 'email', 'tel'];

}

Yoksa Laravel mass assigment hatası verir. Bu Laravel’in dışarıdan veritabanına veri girişine karşı bir güvenlik önlemidir; ama bazen bu durum sıkıcı olabilir. Çünkü tablodaki 20 alan kullanmış olalım. Bunların hepsini yazılabilir mi yapmalıyız toplu veri değişiklikleri yapmak için ? Cevap evet;

Ama kısayolu da var. Laravel’de

    protected $guarded = ['id'];

yaparsak, sadece “id” alanı değiştirilemez olur. Otomatik olarak tüm alanlar fillable olarak atanacaktır. Zaten “id” alanı değiştirilmemesi gereken bir alandır. Genelde bu alan veritabanında auto_inc olarak ayarlıdır. Kısaca veritabanı değer adar.

Laravel'de tüm alanları fillable yapma tekniği

Şimdi bazılarının kafası karışabilir. Şöyle örnekler verebilirler:

$new_rec = new User;

$new_rec->name = 'Selim';
$new_rec->family_name = 'Narende';

$new_rec->save();

Şimdi yukarıdaki örnekte toplu veri aktarımı var mı ? Yok. Böyle bir kayıt eklemede mass assigment es geçilir.

Eğer query builder kullanırsanız aşağıdaki gibi:

$data = [];
$data['name']='Selim';
$data['family_name']='Narende';

DB::table('user')->insert(data);

ya da query builder ile toplu değiştirme, ekleme yaparsanız ne olur ? Bir şey olmaz. Çünkü query builder mass assignment’e bağlı değildir. Onu takmaz.

Mass Assignment koruma mekanizması sadece Eloquent ile çalışır.

saygılar…


Etiketler: