簡體   English   中英

如何使用FriendsOfCake搜索CakePHP 3過濾關聯的HABTM數據

[英]How to filter associated HABTM data with FriendsOfCake Search for CakePHP 3

插件: FriendsOfCake/Search

CakePHP: 3.1.4

我正在使用插件過濾帶有表單的index.ctp視圖數據。 這個類似的問題: 如何對關聯的數據進行過濾是關於一個belongsTo關聯。 我的問題特別是關於關聯的HABTM數據,其中關聯表是通過joinTable而不是直接鏈接的。 在這種情況下,無法在Model中正常進行以下設置:

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

我的表設置如下:

  • 門票屬於許多繪畫
  • 繪畫屬於很多門票
  • 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相關表合並到搜索中?

謝謝!

可用的搜索方法取決於主查詢中可用的字段(在單獨的查詢中正在檢索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;

}

也可以看看

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM