2011-01-29 60 views
3

我正在玩與我跑步的滑雪之旅有關的報價數據庫。我試圖列出報價,但是按照報價人員的名稱排序,並且正在努力讓分頁助手讓我這樣做。cakephp - 按頁面排序第二級關聯

我有四個相關的表。

報價,旅行,人和出席。出勤實質上是人和旅行的連接表。

關係如下;

考勤屬於關聯人的hasMany出席
考勤屬於關聯旅行的hasMany出席
出席的hasMany報價屬於出席

在QuotesController我使用中可容納檢索引用自田間地頭,與相關的考勤一起,和田野來自與出席相關的旅行和人員。

function index() { 
    $this->Quote->recursive = 0; 
    $this->paginate['Quote'] = array(
    'contain' => array('Attendance.Person', 'Attendance.Trip')); 
    $this->set('quotes', $this->paginate()); 
} 

這似乎做工精細,並在視圖,我可以附和了

foreach ($quotes as $quote) { 
echo $quote['Attendance']['Person']['first_name']; 
} 

沒有任何問題。

我不能去工作正在訪問/使用PAGINATE

echo $this->Paginator->sort('Name', 'Attendance.Person.first_name'); 

echo $this->Paginator->sort('Location', 'Attendance.Trip.location'); 

相同的變量排序字段不工作。它似乎排序的東西,但我不知道是什麼。

我傳遞的$ quotes數組看起來像這樣;

Array 
(
    [0] => Array 
      (
       [Quote] => Array 
        (
         [id] => 1 
         [attendance_id] => 15 
         [quote_text] => Hello 

      ) 

       [Attendance] => Array 
      (
         [id] => 15 
         [person_id] => 2 
         [trip_id] => 7 
         [Person] => Array 
          (
           [id] => 2 
           [first_name] => John 
           [last_name] => Smith 

           ) 

         [Trip] => Array 
          (
           [id] => 7 
           [location] => La Plagne 
           [year] => 2000 
           [modified] => 
         ) 

       ) 

     ) 

我將非常感謝,如果有人可以建議我如何能夠通過與報價相關的人的FIRST_NAME的排序。我懷疑我的語法錯了,但我一直無法找到答案。以這種方式進行二級關聯是不可能的?

我幾乎全新與cakephp所以請溫柔。

非常感謝。

+1

你解決了你的問題嗎?我面對的是完全一樣的。乾杯。 – Nicolas 2011-02-28 16:04:40

+0

同樣的問題,如何解決這個問題 – baur79 2014-11-29 18:38:36

回答

1

我以前有過類似的問題。雖然沒有排序。嘗試將關聯的表放入另一個數組中。

echo $this->Paginator->sort('Name', 'Attendance.Person.first_name'); 

變化:

echo $this->Paginator->sort('Name', array('Attendance' => 'Person.first_name')); 

希望這有助於

0

我也在找這方面的幫助。

到目前爲止,我發現您可以在使用可鏈接插件https://github.com/Terr/linkable後,對控制器的分頁選項中的多級關聯進行排序。 ,但當您嘗試對視圖中的分頁符進行排序時,它會崩潰。我使用雜誌剪報的控制器。每個裁剪屬於一個問題,每個問題都屬於一個發佈。

$this->paginate = array(
     "recursive"=>0, 
     "link"=>array("Issue"=>array("Publication")), 
     "order"=>array("Publication.name"=>"ASC", 
     "limit"=>10); 

調試$這個 - 後> Paginator-> params-> paging->視圖中的剪輯,你可以看到那種在兩個不同的地方,「默認」和「選項」中所述。排序信息需要同時存在才能在視圖中工作。 這裏是在控制器設定順序之後:

[Clipping] => Array 
      (
       [page] => 1 
       [current] => 10 
       [count] => 6685 
       [prevPage] => 
       [nextPage] => 1 
       [pageCount] => 669 
       [defaults] => Array 
        (
         [limit] => 10 
         [step] => 1 
         [recursive] => 0 
         [link] => Array 
          (
           [Issue] => Array 
            (
             [0] => Publication 
            ) 

          ) 

         [order] => Array 
          (
           [Publication.name] => ASC 
          ) 

         [conditions] => Array 
          (
          ) 

        ) 

       [options] => Array 
        (
         [page] => 1 
         [limit] => 10 
         [recursive] => 0 
         [link] => Array 
          (
           [Issue] => Array 
            (
             [0] => Publication 
            ) 

          ) 

         [order] => Array 
          (
           [Publication.name] => ASC 
          ) 

         [conditions] => Array 
          (
          ) 

        ) 

      ) 

,這裏是使用後$這 - > Paginator->排序( 「公開」, 「Publication.name」);.

注意options數組是空的。

[Clipping] => Array 
      (
       [page] => 1 
       [current] => 10 
       [count] => 6685 
       [prevPage] => 
       [nextPage] => 1 
       [pageCount] => 669 
       [defaults] => Array 
        (
         [limit] => 10 
         [step] => 1 
         [recursive] => 0 
         [link] => Array 
          (
           [Issue] => Array 
            (
             [0] => Publication 
            ) 

          ) 

         [order] => Array 
          (
           [Publication.name] => DESC 
          ) 

         [conditions] => Array 
          (
          ) 

        ) 

       [options] => Array 
        (
         [page] => 1 
         [limit] => 10 
         [recursive] => 0 
         [link] => Array 
          (
           [Issue] => Array 
            (
             [0] => Publication 
            ) 

          ) 

         [order] => Array 
          (
          ) 

         [conditions] => Array 
          (
          ) 

        ) 

確實需要修改paginator類來使這項工作?


UPDATE:


我發現了問題:在覈心蛋糕控制器分頁程序 合併默認和選項來創建查找查詢。 但使用可鏈接進行排序時,選項數組爲空。因爲默認情況下列出的選項會覆蓋默認值,而空數組將替換默認的選項數組。 解決這個被延伸app_controller.php的內部的功能PAGINATE和取消選項陣列順序值,如果它是空的: (位於cake/lib /控制器/ Controller.php這樣線1172)

if(empty($options["order"])){ 
unset($options["order"]); 
} 

則選項不會被空白數組覆蓋。 當然這不應該在controller.php裏面改變,而是把它放在app_controller.php中並將它移動到你的應用文件夾中。

0

在CakePHP 3上,可以通過在控制器上添加'sortWhitelist' params到$this->paginate來解決此問題。

$this->paginate = [ 
    // ... 
    'sortWhitelist' => ['id', 'status', 'Attendance.Person.first_name'] 
]; 

然後在您的視圖:

echo $this->Paginator->sort('Name', 'Attendance.Person.first_name'); 

這說明in the docs

當你要排序的任何相關的數據,此選項是必需的,或計算領域可能成爲您的分頁查詢的一部分:

但是t帽子可能很容易被疲倦的眼睛遺漏,所以希望這可以幫助那裏的人!