在过滤一些数据后,我创建了一个变量 $ customers 。这个变量是一个简单的数组 它具有以下值:
array(
(int) 1 => 'Customer1',
(int) 2 => 'Customer2',
(int) 3 => 'Customer3'
)
我将这个数组从控制器传递到像这样的视图
$this->set('customers', $customers);
在视图中,我在表单中使用此数组,以便用户可以选择一个
echo $this->Form->input('customer_id', array('options' => array($customers)));
选择表单中显示的数据是'Customer1','Customer2','Customer3 '
到目前为止,Eveyting工作正常。
现在,在用户提交数据之后,我想在控制器中做一些进一步的逻辑。我想获取用户选择的数据并将其保存在第二个表中。所以我这样做:
$this->Invoice->set('secondtabel', $this->request->data['Invoice']['customer_id']);
数据保存在第二个表格中,但问题是保存值'1','2','3 不是客户名称。如何保存客户的名称而不是数组中的标识号。
请耐心等待我,我是cakephp和php的新手。
答案 0 :(得分:2)
我认为这实际上是您的HTML问题,您的选择框可能看起来像这样:
<select name="customer_id">
<option value="1">Customer1</option>
<option value="2">Customer2</option>
<option value="3">Customer3</option>
</select>
这就是你的值为1,2或3而不是Customer1等的原因,因为$this->request->data['Invoice']['customer_id']
等于1,2或3等。
我的建议是解决问题的根源,我认为只将值传递到您的选择框中,您应该得到这样的HTML:
<option>Customer1</option>
...这意味着$this->request->data['Invoice']['customer_id']
将等于Customer1
等。
所以,试试这个:(array_values将返回一个只包含值的数组,基本上是剥离键)
$this->set('customers', array_values($customers));
这应该可以解决您的问题。但是,就结构化数据而言,您当前的方式(存储1,2或3等)实际上是执行此操作的正确方法。这样,您在检索此数据时只需加入 customers表,就可以获取这样的名称......如下所示:
$invoices = $this->Invoice->find('all', array(
'conditions' => array(
// your custom find conditions
),
'joins' => array(
array(
'table' => 'customers',
'alias' => 'Customer',
'type' => 'LEFT',
'conditions' => array('Customer.id = Invoice.customer_id')
)
),
'fields' => array(
'Invoice.*', // retrieve regular invoice data
'Customer.name' // retrieve the joined customer name too
)
));
这样您仍然可以将客户ID存储为整数,并在您检索该数据时使用SQL查找名称。
您可能只想将客户的名称存储为文本而想要这样做的一个原因是您希望存储客户名称,因为它在当时显示,这意味着它在将来,附有该名称的先前发票不会随之更改,因为该名称存储在文本中,而不是对包含已更改名称的另一个表的数字引用。
希望这有帮助。
文档