2015-11-04 17 views
9

Null olsa bile, tüm özelliklerle Laravel'de bir model almak için bir yol var mı? Sadece bir modelin null olmayan özniteliklerle döndüğü anlaşılıyor.Tüm Özelliklere Sahip Laravel Modellerini Alın

Bunun nedeni, modeldeki öznitelikler varsa, model niteliklerini bir diziden güncelleyecek bir işlevim olmasıdır. Ayarlamadan önce belirli bir özelliği varsa modeli kontrol etmek için property_exists() işlevini kullanırım. Dizi anahtarı ve model özniteliğinin eşleşmesi beklenir, dolayısıyla nasıl çalışır.

Model zaten öznitelikler ayarlanmışsa iyi çalışır, çünkü öznitelik var ve dizeden değeri alır. Ancak, özellik daha önce boş değildiyse hiçbir şey güncellenmeyecek veya ayarlanmayacaktır, çünkü bu özellik property_exists() kontrolünü başarısızlığa uğratacaktır.

Nihayetinde gerçekleşen şey, tek bir özellik dizim ve belki de iki modelim olmasıdır. Ve setter işlevimi çalıştırıyorum, öznitelikler dizisini geçiyorum ve her bir nesnenin ayrı çağrılarda. Modelde eşleşen bir özellik varsa, güncellenir.

+1

try-model-> getAttributes() –

+0

Cevabımda hiç bir düşünce yok mu? –

cevap

11

bunu yapmanın iki yolu vardır. Bir yöntem, modelinizde varsayılan özellik değerlerini tanımlamaktır.

protected $attributes = ['column1' => null, 'column2' => 2]; 

Ardından, modelin özelliklerini almak için getAttributes() yöntemi kullanabilirsiniz.

Varsayılan öznitelikleri ayarlamak istemezseniz, çalışacak hızlı bir yöntem yazdım. Öznitelik ayarlanmamış ise

public function getAllAttributes() 
{ 
    $columns = $this->getFillable(); 
    // Another option is to get all columns for the table like so: 
    // $columns = \Schema::getColumnListing($this->table); 
    // but it's safer to just get the fillable fields 

    $attributes = $this->getAttributes(); 

    foreach ($columns as $column) 
    { 
     if (!array_key_exists($column, $attributes)) 
     { 
      $attributes[$column] = null; 
     } 
    } 
    return $attributes; 
} 

Temelde, bu o özelliğin null değeri ekler ve bir dizi olarak size dönecektir.

+0

Hedef boş değerleri boş değere ayarlamaktır, geçişteki alana '-> nullable() 'eklemek en basit yol olacaktır.Yeni bir yöntem yazmanız veya modele koymanız gerekmez. Bunların ikisi de gerekli olmamalıdır. – tam5

+0

Amaç, henüz ayarlanmadığı zaman tüm öznitelikleri alabilmesidir ve bunu yapmanın tek yolu değerleri null (veya başka bir varsayılan değer) olarak ayarlamaktır. –

+0

En azından, herhangi bir kod göremediğimiz için, “getAttributes()' ın çalışmamasından dolayı boş bir örnek ile çalıştığını varsayıyorum. Örneğin, $ user = new User; $ user gibi bir şey. -> getAttributes(); 'r değil eturn özellikleri ayarlanmadığı için. –

0

Güncelleme:

bunu gibi başlatmasını sonra bunu çalışıyorsanız:

$model = new Model; 

sonra Thomas Kim'in cevabı farklılık ediniz.

Aksi taktirde: Model örneğinde, toArray() veya getArributes() yöntemini kullanarak, boş değerleri içeren tüm özniteliklere geri dönebilirsiniz. Daha sonra kontrol etmek için array_key_exists'u kullanabilirsiniz. böylece gibi

: Burada

if (array_key_exists('foo', $model->getAttributes())) { 
    $model->foo = 'new value'; 
} 
+0

Yeni bir model oluşturmaya çalıştım ve bu işlevlerden birini denerken boş bir dizi alıyorum. Bence bunun beklenen bir şey olduğunu düşünüyorum. En azından getAttributes() dokümantasyonundan, "Modeldeki tüm mevcut özellikleri al." – kenshin9

+0

Projenizde ya da sadece tinker içinde mi çektiniz? – tam5

+0

Maalesef, bundan bahsetmeyi düşünmedim. Projemde bunu hazırladım. – kenshin9

0
$model->getAttributes(); 
(veri tabanı tablosundaki depolandığı gibi) üzerinde

$model->toArray() 

üzerinde dönecek ham niteliklerin bir dizi döndürür

tüm model ham (kullanıldığı takdirde) mutasyona uğramış, ve ekteki

nitelikleri

Umarım yardımcı olur!

İlgili konular