gpt4 book ai didi

php - CakePHP 4 - 保存关联数据不适用于 3 个简单表格

转载 作者:行者123 更新时间:2023-12-04 17:10:09 25 4
gpt4 key购买 nike

我在 CakePHP 4 中有一个应用程序,但在保存相关模型数据时遇到问题。我读过Saving Associated Data在 Cake 文档中,但非常不清楚这如何适用,尤其是在我的用例中。

应用程序有 3 个与这个问题相关的表:

  • items
  • sizes
  • items_sizes_wanted

该应用程序允许用户请求服装项目 (items),并且用于输入/保存此类项目的表单具有不同尺寸的下拉列表 (sizes)。每个尺寸都有一个唯一的 ID。用户可以在保存项目时选择一种或多种尺寸。 items_sizes_wanted表应该根据用户选择的尺寸保存一行(或多行),以及相应的项目 ID。例如,如果他们为商品 999 保存尺寸 2、3 和 4,则此表中将有 3 行:

size_id | item_id
--------|---------
2 | 999
3 | 999
4 | 999

代码已经烘焙,表类中的关联看起来没问题:

// src/Model/Table/ItemsSizesWantedTable.php
public function initialize(array $config): void
{
parent::initialize($config);

$this->setTable('items_sizes_wanted');

$this->belongsTo('Items', [
'foreignKey' => 'item_id',
'joinType' => 'INNER',
]);
$this->belongsTo('Sizes', [
'foreignKey' => 'size_id',
'joinType' => 'INNER',
]);
}

项目的实体类看起来也不错:

// src/Model/Entity/Item.php

// @property \App\Model\Entity\ItemsSizesWanted[] $items_sizes_wanted

protected $_accessible = [
// ...
'items_sizes_wanted' => true,
// ...
];

在保存项目的表单中 ( src/templates/Items/add.php ) 我使用了表单助手并使用点符号命名它:

<?php
// Note that $sizes is an array of key/value pairs from the
// 'sizes' table.
?>
<?= $this->Form->control('items_sizes_wanted.size_id', ['options' => $sizes, 'multiple' => 'multiple']) ?>

在浏览器中呈现时,这会生成一个有效的数组语法名称。 <option>在内部呈现的都具有有效 ID,即来自 sizes 的那些表。

<select name="items_sizes_wanted[size_id]" multiple="multiple">

当我使用以下方法将数据保存在我的 Controller ( src/Controller/ItemsController.php) 中时:

public function add()
{
$item = $this->Items->newEmptyEntity();

if ($this->request->is('post')) {
$item = $this->Items->patchEntity($item, $this->request->getData());

// Edit: some of the entity properties are manually set at this point, e.g.
$item->item_status = 'Wanted';

if ($this->Items->save($item)) {
$this->Flash->success(__('Your item has been listed.'));
}
}
}

数据正确保存到items表和闪烁的成功消息,“您的项目已列出。”显示在浏览器中。

但是 - 没有数据写入 items_sizes_wanted .

我不确定这是为什么。链接的文档没有具体说明应该如何使用 Form Helper,所以我假设我对该表单字段的语法是正确的,但它可能不是。

如果我在按保存后使用 debug($item); die; 调试实体在 Controller 中它有 'items_sizes_wanted' => [ ]即使我使用表单选择了多个尺寸选项。

请有人帮忙,因为我不知道这里出了什么问题?

最佳答案

免责声明:我不太了解 CakePHP,但我想我知道解决方案,或者至少可以为您指明正确的方向。

您只获得一个选定尺寸而不是多个尺寸的原因是因为生成的输入字段被命名为 items_sizes_wanted[size_id],然而,为了让 PHP 将多个值解析为一个数组,它们需要被命名为 items_sizes_wanted[size_id][]。当请求参数以[]结尾时,PHP会正确解析所有请求属性到一个数组中。

例如:这是一个包含 items_sizes_wanted[size_id][]=A&items_sizes_wanted[size_id][]=B&items_sizes_wanted[size_id][ 的 POST 主体的请求的 var_dump($_POST); ]=C

array (size=1)
'items_sizes_wanted' =>
array (size=1)
'size_id' =>
array (size=3)
0 => string 'A' (length=1)
1 => string 'B' (length=1)
2 => string 'C' (length=1)

将其与 items_sizes_wanted[size_id]=A&items_sizes_wanted[size_id]=B&items_sizes_wanted[size_id]=C 的 POST 主体进行比较(注意每个末尾的空括号已被删除):

array (size=1)
'items_sizes_wanted' =>
array (size=1)
'size_id' => string 'C' (length=1)

这是我对 CakePHP 不太熟悉的部分。我查看了代码对于 CakePHP's FormHelper ,并基于 the template code ,我认为您需要将 add.php 中的表单代码更改为如下所示(重新格式化以提高可读性):

<?php
// Note that $sizes is an array of key/value pairs from the
// 'sizes' table.
?>
<?=
$this->Form->control(
'items_sizes_wanted.size_id',
[
'options' => $sizes,
'multiple' => 'multiple'
'type' => 'selectMultiple'
]
)
?>

基于 the __call() method in FormHelper ,你可能也可以这样写:

$this->Form->selectMultiple(
'items_sizes_wanted.size_id',
[
'options' => $sizes,
'multiple' => 'multiple'
]
);

但是,我不熟悉创建 control($fieldName, $options)inputType($fieldName, $options) 之间的细微差别,所以他们可能会产生不同的输出。

关于php - CakePHP 4 - 保存关联数据不适用于 3 个简单表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69619193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com