无法使用复合pK CakePHP4查看

kx5bkwkv  于 2022-11-24  发布在  PHP
关注(0)|答案(1)|浏览(175)

cakephp-4.x中,我无法访问复合主键表的控制器视图操作。(http://localhost:8765/invoice-items/view/1)

以下是cake bake创建的代码示例:

InvoiceItemsTable类,其中主键定义为组合。

class InvoiceItemsTable extends Table
{
    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */
    public function initialize(array $config): void
    {
        parent::initialize($config);

        $this->setTable('invoice_items');
        $this->setDisplayField(['item_id', 'invoice_id', 'unit_id']);
        $this->setPrimaryKey(['item_id', 'invoice_id', 'unit_id']);

        $this->addBehavior('Timestamp');

        $this->belongsTo('Items', [
            'foreignKey' => 'item_id',
            'joinType' => 'INNER',
        ]);
        $this->belongsTo('Invoices', [
            'foreignKey' => 'invoice_id',
            'joinType' => 'INNER',
        ]);
        $this->belongsTo('Units', [
            'foreignKey' => 'unit_id',
            'joinType' => 'INNER',
        ]);
    }
...

发票项控制器视图方法

/**
     * View method
     *
     * @param string|null $id Invoice Item id.
     * @return \Cake\Http\Response|null|void Renders view
     * @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
     */
    public function view($id = null)
    {
        $invoiceItem = $this->InvoiceItems->get($id, [
            'contain' => ['Items', 'Invoices', 'Units'],
        ]);

        $this->set(compact('invoiceItem'));
    }

最后是phpmyadmin中invoice_items表结构的屏幕截图:

我尝试访问类似于(http://localhost:8765/invoice-items/view/1,1,6)的视图,但我得到了相同的错误... with primary key ['1,1,6'].我不知道如何表示URL中的组合主键?或者是什么问题?
我使用的是CakePHP版本4.4.2

ylamdve6

ylamdve61#

Table::get()需要将组合键作为数组传递,例如[1, 1, 6]
假设您使用的是默认应用框架中的回退路由,则可以将其他参数作为路径部分传递,例如:

/invoice-items/view/1/1/6

并在控制器操作中接受它们,例如:

public function view($itemId, $invoiceId, $unitId)

并相应地从构建一个数组以传递给get()作为“id”:

$this->InvoiceItems->get([$itemId, $invoiceId, $unitId], /* ... */)

如果您使用的是带有固定参数的自定义路线,则可以按您喜欢的任何形式添加其他路线,例如使用破折号:

$routes
    ->connect(
        '/invoice-items/view/{itemId}-{invoiceId}-{unitId}',
        ['controller' => 'InvoiceItems', 'action' => 'view']
    )
    ->setPass(['itemId', 'invoiceId', 'unitId'])
    ->setPatterns([
        'itemId' => '\d+',
        'invoiceId' => '\d+',
        'unitId' => '\d+',
    ]);

则您的URL将如下所示:

/invoice-items/view/1-1-6

另请参阅

*操作手册〉路线〉路线元素
*Cookbook〉路由〉将参数传递给操作
*操作手册〉路由〉回退方法

相关问题