2015-04-27 22 views
7

Ho due modelli Utenti & ruoliCakePHP 3.x ordinamento di un altro modello non funziona

Qui "Ruoli hasMany Utenti" e "Utenti belongsTo Ruoli"

Quando l'utente ha salvato stiamo anche chiedendo ruolo utente & record salvato.

Problema: Ho una lista di utenti con colonna nome, cognome, ruoli. Ogni & Ogni colonna ha l'ordinamento ma sull'ordinamento dei ruoli non funziona.

La tabella dei ruoli contiene il campo "nome" per il nome del ruolo. Ho fatto riferimento al link qui sotto, ma non funziona per me. Pagination Sort in Cakephp 3.x

UsersController:

public function index() { 
    $this->paginate = [ 
       'contain' => ['Roles'], 
       'conditions' => [ 
        'Users.user_type <>' => 1 
       ] 
      ]; 

      $this->set('users', $this->paginate($this->Users)); 
      $this->set('_serialize', ['users']); 
} 

index.ctp

<tr> 
       <th><?php echo $this->Paginator->sort('firstname',__('First Name')) ?></th> 
       <th><?php echo $this->Paginator->sort('lastname',__('Last Name')) ?></th> 
       <th><?php echo $this->Paginator->sort('email',__('Email Address')) ?></th> 
       <th><?php echo $this->Paginator->sort('Roles.name',__('Role Associated')) ?></th> 
       <th><?php echo $this->Paginator->sort('status',__('status')) ?></th> 
       <th class="actions"><?php echo __('action') ?></th> 
      </tr> 

Fammi sapere qualsiasi soluzione che avete.

+0

Hai trovato una soluzione? – user2340939

risposta

1

UsersController.php

$this->paginate = [ 
      'contain' => ['Roles'], 
      'conditions' => [ 
       'Users.user_type <>' => 1 
      ], 
      'order' => ['Users.role_id' => 'ASC'] 
     ]; 

Usa 'ordine' => [ 'Models.field' => 'ASC/DESC']

+0

Grazie per la risposta, ma voglio l'ordinamento. Ordinamento sul campo "Ruolo associato" facendo clic. –

+0

Prova a usare il tasto 'ordina' che contiene: http://book.cakephp.org/3.0/en/orm/query-builder.html#sorting-contained-associations –

-1

(vorrei aggiungere un commento a mettere in discussione, ma Non ho abbastanza punti reputazione.)

Ho lo stesso problema.

Questo sta accadendo a causa del modo in cui funziona il comportamento contenibile. Quando CakePHP ottiene tutti i ruoli per un utente associato, emette una query separata (invece di utilizzare un join nella query principale). Quindi mette tutto insieme in un oggetto bello da usare. Dai un'occhiata al sql nel kit di debug.

Quando si chiede di ordinare per nome ruolo, non è possibile perché la tabella Ruoli non si trova da nessuna parte nella query principale. Sto indovinando che ottenete un errore come questo:

Error: SQLSTATE[HY000]: General error: 1 no such column: Roles.name

per fare questo lavoro, si sta andando ad avere per capire come partecipare al tavolo ruoli alla tabella utenti nella query principale per questo a lavoro. Questo è anche il motivo per cui funziona nell'altro modo. Se la tabella Utenti apparteneva alla tabella dei ruoli, non si avrebbe questo problema perché la tabella dei ruoli verrebbe inserita nella query principale.

Un altro modo per farlo funzionare potrebbe essere utilizzare il modello Ruoli per la query principale. Ma se la tabella del tuo utente ha altre associazioni che vuoi ordinare, questo non funzionerà. (Che è il mio caso.)

Ho appena iniziato a entrare in CakePHP 3, quindi non ho davvero una risposta concreta a questo punto, ma spero che questo ti guidi nella giusta direzione.

18

Non vi resta che utilizzare questo:

$this->paginate = [ 
    'sortWhitelist'=>['Roles.name'] 
]; 
+3

Per essere un po 'più preciso: hai anche per includere tutte le altre colonne che vuoi ordinare. 'Controller-Action ' codice $ this-> paginate = [ 'contiene' => ['Ruoli'], 'sortWhitelist' => ['Roles.name', 'firstname', 'lastname', ' email ',' status '] ]; ' [link] (http://book.cakephp.org/3.0/en/controllers/components/pagination.html#control-which-fields-used-for-ordering) – Tobse