Cakephp: Запазване на стойността на масива, а не на цялото число

След като филтрирах някои данни, създадох променлива $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)));

Данните, които се показват във формуляра за избор, са тези „Клиент1“, „Клиент2“, „Клиент3

Eveyting работи добре досега.

Сега, след като потребителят е изпратил данните, искам да направя допълнителна логика в контролера. Искам да взема данните, които потребителят е избрал, и да ги запиша във втора таблица. Така че правя това:

   $this->Invoice->set('secondtabel', $this->request->data['Invoice']['customer_id']);

Данните се записват във втората таблица, но проблемът е, че записва стойността '1', '2', '3', а не името на клиента. Как мога да запазя името на клиента, а не идентификационния номер от масива.

Моля, имайте търпение, аз съм нов в cakephp и в php като цяло.


person RaduS    schedule 16.01.2014    source източник


Отговори (1)


Предполагам, че това всъщност е проблем с вашия 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 и т.н.), всъщност е правилният начин да направите това. По този начин просто се присъединявате към таблицата с клиенти, когато извличате тези данни, и можете да вземете името по този начин... Нещо подобно:

$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
    )
));

По този начин все още съхранявате идентификатор на клиент като цяло число и просто търсите името с SQL, когато отидете да извлечете тези данни.

Възможна причина, поради която може да искате да го направите просто като съхраните името на клиента като текст, е, че искате да съхраните името на клиента както се появява в момента, което означава, че ако се промени в бъдеще, предишно фактури с това прикачено име няма да се променят с него, защото това име се съхранява в текст, а не като цифрова препратка към друга таблица, съдържаща име, което е променено.

Надявам се това да помогне.

Документи

person scrowler    schedule 16.01.2014
comment
Благодаря МНОГО @scrowler. Твоето обяснение е толкова добро и предложението за обединяване на масите е точно на място :) Ти си моят герой днес - person RaduS; 16.01.2014