示例过滤器挂钩可使用相关字段更新项目

时间:2019-03-25 22:01:09

标签: php mysql directus

我有3个收藏集:“客户”,“经销商”和“订单”。 客户与经销商之间存在多对一的关系。 转销商与客户之间存在一对多关系。 订单通过多对一关系与客户相关。

我想使用先前配置的多对一关系,根据所选客户自动设置orders.reseller字段。

$ payload对象仅包含“订单”列,因此我看不到“ customer.reseller”,只是“ customer”。

https://docs.directus.io/extensions/hooks.html#filter-hooks

  

点表示法   get()和has()方法可以使用点符号来访问子元素。例如:get('data.email')。

     

有效载荷对象   有效载荷对象是可数组的,这意味着您可以将数据作为数组$ payload ['data'] ['email]进行交互,但不能执行\ Directus \ Util \ ArrayUtils :: get($ payload,'data.email ')。

尝试使用\Directus\Util\ArrayUtils::get()时,我没有得到任何结果,但是$payload->get()可以正常工作。在下面的示例中,我只是将返回的数组设置为订单项中的文本字段(“ out”)以进行测试。

'filters' => [
                'item.create.orders:before' => function (\Directus\Hook\Payload $payload) {
                    $data = $payload->getData();
                    //$data = $payload->get('customer');
                    //$data = \Directus\Util\ArrayUtils::get($payload,'customer');
                    $out = json_encode($data);
                    $payload->set('out',$out);
                    return $payload;
                }

我希望ArrayUtils中的get函数能够使我作为数组与之交互,并根据选定的“客户”从“客户”表中检索“经销商”列。

有效载荷对象仅返回类似以下的数组:{“ order_number”:“ 1234”,“ customer”:“ 15”}

“客户”字段应与“客户”表中的“ id”(行)匹配,我希望查看该字段的“经销商”列值。

1 个答案:

答案 0 :(得分:2)

为此,我的解决方案是使用ZendDB查询而不是get函数。

https://docs.directus.io/api/data.html#zend-db-tablegateway

'item.create.orders:before' => function (\Directus\Hook\Payload $payload) {
                    $customer_id = $payload->get('customer'); //get customer_id from 'order' item
                    $container = \Directus\Application\Application::getInstance()->getContainer();
                    $dbConnection = $container->get('database'); // connect to database
                    $table = new \Zend\Db\TableGateway\TableGateway('customers', $dbConnection); // connect to table
                    $results = $table->select(['id' => $customer_id]); // select row with 'customer_id'
                    $customer = $results->current(); // get array of current 'customer' row
                    $reseller = $customer->reseller; // get 'reseller' column value from row
                    $payload->set('reseller',$reseller); //Update Payload
                    return $payload;
                }