2014-06-17 14 views
8

Sto provando a impostare una relazione hasManyTrough con Eloquent, ma non è chiaro come funzioni dai documenti.Ha molti passaggi con la tabella pivot in Laravel4

Tabelle:

users 
    - id 
    - firstname 
    - ...etc 

accounts 
    - id 
    - user_id 
    - username 
    - ...etc 

roles 
    - id 
    - permissions 

account_role 
    - id 
    - account_id 
    - role_id 

Modelli

<?php 
class User extends Eloquent { 

    public function account() 
    { 
     return $this->hasOne('Account'); 
    } 

    // This is what I'm trying to achieve 
    public function roles() 
    { 
     return $this->hasManyThrough('Role', 'Account'); 
    } 
} 

class Role extends Eloquent { 

    public function accounts() 
    { 
     return $this->belongsToMany('Account')->withTimestamps(); 
    } 
} 

class Account extends Eloquent { 

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

errore e mettere in discussione L'errore Sono gettings è: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'roles.account_id' in 'on clause'

So che posso fare qualcosa $user->account->roles, ma voglio essere in grado di fare $user->roles. Come si imposta correttamente?

+0

'hasManyThrough' non funziona con molti-a-molti, controlla questa risposta: http://stackoverflow.com/questions/23788844/hasmanythrough-with-on-to-many-relationship/23789210 # 23789210. Se hai ancora domande, non esitare a chiedere. –

+0

Soluzione piacevole, ma ho bisogno di caricare con entusiasmo per lavorare con il modello Utente. Forse c'è una soluzione nel definire il mio 'Relazione 'o qualcosa del genere. Non sono sicuro di come farlo. – DerLola

+0

Certo, puoi estendere Eloquent e creare relazioni personalizzate, metodi di modelli e cose. Dipende da te, la risposta che ho collegato dovrebbe darti un'idea di come farlo. Ho fatto esattamente la stessa cosa per 'belongsToThrough', lavorando al contrario. –

risposta

9

Alla fine sono stato in grado di risolvere questo nel modo seguente:

class User extends Eloquent { 

    /** 
    * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany 
    */ 
    public function roles() 
    { 
     return $this->account->belongsToMany('Navicula\Entities\Role'); 
    } 
} 

ho sospettato questo non sarebbe desideroso di carico Conti, causando un sacco di query di spese generali. Tuttavia, quando ho provato utilizzando User::with('roles')->limit(100)->get(); e collegato le query, le seguenti query correvano:

SELECT * FROM `users` WHERE `users`.`deleted_at` IS NULL LIMIT 100 
SELECT * FROM `accounts` WHERE `accounts`.`deleted_at` IS NULL LIMIT 1 
SELECT `roles`.*, `account_role`.`account_id` as `pivot_account_id`, `account_role`.`role_id` as `pivot_role_id` FROM `roles` inner join `account_role` on `roles`.`id` = `account_role`.`role_id` WHERE `account_role`.`account_id` in ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '60', '61', '62', '63', '64', '65', '67', '68', '70', '71', '72', '73', '74', '75', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106') 

che è esattamente quello che vogliamo. Grazie Taylor ;-)

+0

Non ha funzionato per me. – brunoramonalmeida

Problemi correlati