2015-11-23 51 views
1

插件:FriendsOfCake/Search如何篩選與FriendsOfCake搜索相關HABTM數據CakePHP的3

CakePHP: 3.1.4 

我使用的插件用形式來篩選我index.ctp查看數據。 這個相似的問題: How to Filter on Associated Data 是關於一個belongsTo關聯。我的問題特別是關聯的HABTM數據,其中我的關聯表通過joinTable而不是直接鏈接。像下面的模型中的正常設置是不是在這種情況下工作:

->value('painting', [ 
    field' => $this->Paintings->target()->aliasField('id') 
)] 

我的表設置,如:

  • 門票belongsToMany繪畫
  • 繪畫belongsToMany門票
  • joinTable tickets_paintings

下面是主要設置:

class TicketsTable extends Table 
{ 
    public function initialize(array $config) 
    { 
     ... 

     $this->belongsToMany('Paintings', [ 
     'foreignKey' => 'ticket_id', 
     'targetForeignKey' => 'painting_id', 
     'joinTable' => 'tickets_paintings' 
     ]); 
    } 

    public function searchConfiguration() 
    { 
     $search = new Manager($this); 

     $search->value('status', [ 
       'field' => $this->aliasField('active'), 
      ])->like('member_name', [ 
       'field' => $this->Members->target()->aliasField('surname'), 
       'filterEmpty' => true 
      ])->value('painting', [ 
       'field' => $this->Paintings->target()->aliasField('id'), // not working 
      ]); 

     return $search; 

    } 
class TicketsController extends AppController 
{ 
    public function index() 
    { 
    $query = $this->Tickets 
     ->find('search', 
      $this->Tickets->filterParams($this->request->query)) 
     ->contain(['Members', 'Paintings', 'Appointments']); 

    ... 
    } 

其他一切工作和參數添加到URL時篩選等等,所以我只把在部分地方某物有是錯的。

過濾後,我得到一個錯誤:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Paintings.id' in 'where clause' 

包含工作正常剛從畫表中的門票視圖中顯示數據時。

但是在SQL查詢的代碼中,我可以看到,所有包含的表(Members,Appoinments)都加入了查詢,但的Paintings表中,顯然它找不到列...而我猜想它不能直接加入它,因爲它們只通過joinTable連接。

我是CakePHP的新手,我無法真正弄清楚我在這裏做錯了什麼,所以希望有人能幫助我一點。

我是否必須在插件設置中使用不同的語法?我是否必須以不同的方式設置我的表格?或者我可以如何告訴查詢在搜索中包含habtm相關表?

謝謝!

回答

2

可用的搜索方法依賴主查詢中可用的字段(hasManybelongsToMany正在獨立查詢中檢索關聯)。

雖然你可以手動在控制器中加入它,使用callback - 或finder -filter可能是更好的方法,這樣你可以修改模型層的查詢,你可以很容易地利用Query::matching()過濾通過相關數據。

下面是一個(未經測試),例如,應該給你一個提示:

use Cake\ORM\Query; 
use Search\Type\Callback; // This changed in master recently 
          // now it's Search\Model\Filter\Callback 

// ... 

public function searchConfiguration() 
{ 
    $search = new Manager($this); 

    $search 
     // ... 
     ->callback('painting', [ 
      'callback' => function (Query $query, array $args, Callback $type) { 
       return $query 
        ->distinct($this->aliasField('id')) 
        ->matching('Paintings', function (Query $query) use ($args) { 
         return $query 
          ->where([ 
           $this->Paintings->target()->aliasField('id') => $args['painting'] 
          ]); 
        }); 
      } 
     ]); 

    return $search; 

} 

參見

+0

我剛剛測試了你的例子「原樣」,並與另一個表,它的作品完美!太感謝了!我仍然在理解回調的概念和語法方面遇到了一些麻煩,但我會進一步研究它,因爲我需要更多類似的東西。也感謝鏈接! – eve