2015-04-27 13 views
7

mam dwa modele Użytkownicy & RoleCakePHP 3.x Sortowanie innego modelu nie działa

Tutaj „role hasMany Użytkownicy” i „Użytkownicy belongsTo Roles”

Gdy użytkownik zapisany jesteśmy również z prośbą rola użytkownika & zapisano zapis.

Problem: Mam listę użytkowników z kolumną Imię, Nazwisko, Role. Każda & Każda kolumna ma sortowanie, ale przy sortowaniu ról nie działa.

Tabela ról zawiera pole "nazwa" dla nazwy roli. Odsyłam poniższy link, ale to nie działa dla mnie. 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> 

Daj znać żadnego rozwiązania masz.

+0

Czy można znaleźć rozwiązanie? – user2340939

Odpowiedz

1

UsersController.php

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

Użyj 'porządek' => [ 'Models.field' => 'ASC/DESC']

+0

Dziękuję za odpowiedź, ale chcę sortować. Sortowanie w polu "Związane z rolą", klikając. –

+0

Spróbuj użyć klucza sortowania, który zawiera: http://book.cakephp.org/3.0/en/orm/query-builder.html#sorting-contained-associations –

-1

(dodam komentarz do was pytanie, ale Nie mam wystarczającej liczby punktów reputacji.)

Mam ten sam problem.

Dzieje się tak ze względu na sposób, w jaki można działać z zachowaniem. Kiedy CakePHP pobiera wszystkie role dla skojarzonego użytkownika, wydaje osobne zapytanie (zamiast używać sprzężenia w głównym zapytaniu). Następnie składa wszystko razem w ładny obiekt do użycia. Spójrz na sql w zestawie do debugowania.

Gdy poprosisz o sortowanie według nazwy roli, nie może tak być, ponieważ ról tabeli nie można znaleźć w głównym zapytaniu. Jestem zgadywania, otrzymuję błąd jak poniżej:

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

do tej pracy, masz zamiar dowiedzieć się, jak dołączyć do stołu role tabeli Users w głównym zapytaniu do tego, aby praca. To także dlatego działa w drugą stronę. Jeśli tabela Użytkownicy należała do tabeli ról, problem ten nie występowałby, ponieważ tabela ról byłaby dołączona do głównej kwerendy.

Innym sposobem, aby to zadziałało, może być użycie modelu ról dla głównego zapytania. Ale jeśli stół użytkownika ma inne, wiele skojarzeń, które chcesz sortować, to nie zadziała. (Który jest w moim przypadku.)

Właśnie zacząłem wchodzić w CakePHP 3, więc naprawdę nie mam konkretnej odpowiedzi w tym momencie, ale mam nadzieję, że to cię we właściwym kierunku.

18

Po prostu trzeba to wykorzystać:

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

Aby być nieco dokładniejszym: masz również aby uwzględnić wszystkie inne kolumny, które chcesz posortować. W kontrolerze Action 'kod $ this-> paginate = [ 'zawiera' => ['Role'], 'sortWhitelist' => ['Role.name', 'firstname', 'lastname', ' email "," status "] ]; ' [link] (http://book.cakephp.org/3.0/en/controllers/components/pagination.html#control-which-fields-used-for-ordering) – Tobse

Powiązane problemy