2017-02-06 54 views
5

ben bir sorun haline çalıştırmak mutasyona uğramış ve gerçekten sadece küçük bir rahatsızlık olmakla ...laravel - koparma nitelik

Temelde ne gerek seçkin kutusu için bir ilişkisel dizidir. Normal olarak, bu pluck() işlevi kullanılarak elde edilebilir.

Sorun şu ki, 'metin' olarak kullanmak istediğim öznitelik aslında veritabanında bulunmuyor, iki alanı bir araya getiren bir mutator.

public function getNameAttribute() { 
    return $this->first_name . ' ' . $this->last_name; 
} 

Ben modeline $appends diziye 'name' alanını ekleyerek diziye modeli döküm bu alanı içerecektir biliyoruz ancak bu basit bir yolu var mı pluck()

çalışmak görünmüyor İstemek istemek istiyorum? İşlev veya beyan eksik mi? Koleksiyon üzerinde manuel olarak döngü yapmaktan ve kendi ortak dizim oluşturmadan daha elverişli bir şey var mı?

Güncelleştirme Ben bir aptalım. İki parametre yerine koparmak için bir dizi geçiriyordum. Görünüşe göre pluck, $appends özniteliğini kullanır. koleksiyonları DEĞİL$collection->pluck('mutatedValue', 'key'); yardım için sorgu oluşturucu $queryBuilder->pluck('mutatedValue', 'id');

sayesinde çocuklar ile çalışırken, bu sadece eserlerini unutmayın.

cevap

4

dinamik olarak koleksiyonunda nesnelere niteliğini ekleyebilirsiniz:

$users->each(function ($model) { $model->setAppends(['name']); }); 
$users->pluck('name'); 

Bu koleksiyon sadece name kullanmaya izin verirken hep senin dizi verilerinin bir parçası olmak 'name' gerektirmeyen güzel bir avantaja sahiptir zaman.

+0

Sonuçta bunu yapmam gerekmedi, ama biraz daha zarif bir cevap için şimdiye kadar +1. –

1

Sen anlamlı ile sorgulamak ve ben ne zaman mümkün bir select * önlemek istediğini farz

$limited_select = User::all(['id', 'first_name', 'last_name']); 
$limited_select = array_flip($limited_select); 

kullanabilirsiniz. Eğer bıçak böyle bir şey yapabilir seçme üreten

:

<select> 
    @foreach($limited_select as $user) 
     <option value={{$user->id}}> {{$user->getNameAttribute() }} </option> 
    @endforeach 
</select> 

Bu erişgeç olarak içeride getNameAttribute() çünkü User Model Wil hareket çalışacak.

İkinci seçeneğiniz, bir concat'a sahip bir ham sorgu kullanıyor olabilir, ancak elverişli yolun daha zarif olduğunu düşünüyorum.

+0

Bu, maalesef beklediğim sonuçları sağlamıyordu. Aradığım model, $ id => $ name '' 'karakteridir. Sağladığınız şey, '' '$ dizi $ dizin => $ öznitelikleri '' ile sonuçlanacaktır, hala bunları kullanmadan önce koleksiyon üzerinde dönüp sonuçları değiştirmem gerekiyor. –

+0

Peki orayı çevir ve sonra http://php.net/manual/en/function.array-flip.php :) –

+0

array_flip çok boyutlu dizilerle çalışmayacaktı. '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'array_flip() : Sadece STRING ve INTEGER değerlerini döndürebilir! '' ' –

1

Buna bir cevap arıyordum ve farklı bir sonuçla sonuçlandığımı düşündüğümde, paylaşacağımı düşündüm.

User::get()->pluck('name'); 

Nesneyi önce alırsanız, mutasyona uğramış özniteliğiniz erişilebilir olacaktır.