2013-07-31 36 views
9

'u kullanarak birden çok ilgili tablodan sonuçlar döndürme Laravel 4 kullanıyorum ve özellikle de anlamlı ORM kullanan bir cevap arıyorum.Laravel: eloquent

bir client_id ve her satır için tahsis user_id kaplar "görevleri" bir tablo.

bir "istemcileri" masada bir müşteri atıfta CLIENT_ID ve bir "kullanıcıları" masada bir kullanıcı anlamına gelir user_id. Ben yapmak istiyorum ne

: tüm görevleri göstermek ve görüntüler "istemcileri" adı ve "kullanıcıları"

Yani sonuç benim (bıçak şu şekilde görünecektir first_name) görünüm:

@foreach($tasks as $task) 
    <tr> 
     <td>{{ $task->user->first_name }}</td> 
     <td>{{ $task->client->name }}</td> 
     <td>{{ $task->description }}</td> 
    </tr> 
@endforeach 

yukarıdaki görünümü mükemmel iyi $ task-> client-> adını tükürür ama maalesef bir "T gösterir Ben çizgi $ eklediğinizde "olmayan nesnenin özelliği alma rying task-> kullanıcı-> first_name

Benim kontrolör şöyle görünür:

$tasks = Task::with(array('user', 'client'))->get(); 
return View::make('index', compact('tasks')); 

Anladığım kadarıyla benim modeller de bir fark yaratmak, yani benim modeller şu şekilde görünür:

class Task extends Eloquent { 
    protected $guarded = array(); 
    public static $rules = array(); 

    public function client() { 
     return $this->belongsTo('Client'); 
    } 

    public function user() { 
     return $this->belongsTo('User'); 
    } 
} 

Ve:

class User extends Eloquent implements UserInterface, RemindableInterface { 
    public function task() 
    { 
     return $this->hasMany('Task'); 
    } 
} 

Ve:

class Client extends Eloquent { 
    public function projects(){ 
     return $this->hasMany('Project', 'client_id'); 
    } 
} 

Bu işin nasıl yapıldığına dair herhangi bir fikir var mı? Başım ağrıyor bir süredir - aynı zamanda bir veritabanı ilişkisi pro değil ben daha basit bir açıklama daha iyi olduğunu not edin :)

+0

benim kodunu kontrol edebilirsiniz. Muhtemelen Müşteriye ve Kullanıcıya doğrudan bağlantı kurmak için Eloquent'in belongsToMany() yöntemini kullanmalısınız. Pivot tablonuza nasıl ek alanlar ekleyeceğinizle ilgili bilgi için [this] (http://laravel.com/docs/eloquent#working-with-pivot-tables) bölümüne bakın. – ciruvan

+0

Merhaba @cuewizchris Belgelere bir göz attım ve Kullanıcı/Rol/Özet örneğini benim ihtiyaçlarına nasıl çevireceğimi anlayamıyorum. HasMany() öğesini toMany() öğesine değiştirmem gerektiğini mi söylüyorsunuz? Burada biraz kayboldum. – Josh

cevap

2

Sadece bunun üzerinde çalıştım ve kendim için birkaç şey öğrendim. Yaptığım şey, users ve clients arasında çok fazla ilişki kurdu ve ayrıca her görev için açıklamayı kaydeden tasks ilişkisini ele almak için bir pivot tablo oluşturdu.

Burada yazın çok fazlaydı, ancak Görevler tablo pek-çok ilişkili olarak bir özet tablo olduğunu bana görünüyor http://paste.laravel.com/Fpv

+0

Kesinlikle deha. Teşekkür ederim bu tam olarak aradığım şey. Ancak (ve bu benim soru kapsamı dışında olduğunu itiraf ediyorum) - denetleyicinizdeki elverişli sorgularınıza sayfalama ve/veya orderBy (örn. Created_at DESC tarafından sipariş) ifadelerini eklediğinizde gerçekten karmaşık/kırılmalar oluyor :) orderBy created_at, kullanıcının create_at tarihini görevin oluşturulma tarihini değil, almaya çalışıyor. – Josh

+0

Birkaç şey denedim, ancak hevesli yükleme yaparken sıraya koymaya veya sipariş vermeye çalıştığımda her zaman başarısız görünüyor. Bunu yapmak için en iyi yolun, sayfa düzeni için array_slice kullanacağını ve sıralama işlevinin sizin için uygun olacağını varsayıyorum. – user1669496

+6

Asla burada "yazmak için çok fazla" değildir. Bağlantınızı çözemiyorum. – DutGRIFF

0

Çok - çok - bu ilişkiler şu şekilde yapılabilir: Eloquent:

class User extends Eloquent implements UserInterface, RemindableInterface { 
    public function client() 
    { 
     return $this->belongsToMany('Client', 'tasks', 'client_id')->withPivot('description'); 
    } 
} 

ve ters ilişki ...

class Client extends Eloquent { 
    public function users() 
    { 
     return $this->belongsToMany('User', 'tasks', 'user_id'); 
    } 
} 

bu test edilmedi mı, ama doğru olmalıdır.

+0

Bilgi eksikliğim ve soru sayımdan dolayı özür dilerim, ancak sorgulamamdaki sorgunun benim denetleyicimde nasıl görüneceği? – Josh

İlgili konular