cakePhp и внешний ключ: я не могу написать внешний ключ в представлении - PullRequest
1 голос
/ 16 февраля 2012

У меня проблема с полем внешнего ключа: я создал таблицу categories с MySQLWorkbench, которая связана отношением 1:n с другой таблицей: Articles.Кажется, это работает, потому что в Articles есть поле categories_id "INT".

Я запек весь проект, все работает отлично, кроме этого внешнего ключа: вместо ввода, который получит«число», которое я написал бы, чтобы указать число categories_id, есть своего рода пустой «выбор» (список), который ничего не содержит, поэтому я не могу ввести любое число для поля categories_id в моей базе данных:

вот изображение: my categories input

Если я попытаюсь «принудительно» и добавить «статью» (то есть без категории), появляется эта ошибка:

Ошибка: SQLSTATE [23000]: Нарушение ограничения целостности: 1452 Не удается добавить или обновить дочернюю строку: сбой ограничения внешнего ключа (ecommerce. articles, CONSTRAINT fk_articles_categories FOREIGN KEY (categories_id) ССЫЛКИ categories (id) НА УДАЛИТЬ НЕТ ДЕЙСТВИЙ ОБ ОБНОВЛЕНИИ НЕТ ДЕЙСТВИЙ)

А вот мой файл add.ctp (он записан input для categories_id, поэтому яне знаю, что изменить):

<div class="articles form">
<?php echo $this->Form->create('Article');?>
    <fieldset>
        <legend><?php echo __('Add Article'); ?></legend>
    <?php
        echo $this->Form->input('nom');
        echo $this->Form->input('prix');
        echo $this->Form->input('categories_id');
    ?>

Спасибо за вашу помощь


РЕДАКТИРОВАТЬ:

вот что я добавил:

class Article extends AppModel {

    var $belongsTo = array(
        'Category' => array(
            'className'    => 'Category',
            'foreignKey'    => 'category_id'
         )
    );
}

и:

class Category extends AppModel {

    var $hasMany = array(
        'Article' => array(
            'className'    => 'Article',
            'foreignKey'    => 'category_id'
         )
    );
}

и в контроллере (add()):

public function add() {
        //$this->set('categories',$this->Article->Category->find('all'));
        //$c = $this->Article->Category->find('all', array("recursive"=>-1, 'fields'=>array('id', 'nom')));
        $c = $this->Article->Category->find('list');
        $this->set('cat', $c);

но, на мой взгляд, pr($cat) возвращает пустой массив ...

<?php
    echo $this->Form->input('nom');
    echo $this->Form->input('prix');
    echo $this->Form->input('category_id', array('option'=>$cat));
            pr($cat);
?>

1 Ответ

1 голос
/ 16 февраля 2012

Это из-за соглашения об именах ... если ваша таблица называется categories, тогда внешний ключ в articles должен быть category_id (в единственном числе), а модель должна называться Category.Контроллер должен передать в представление переменную с именем «category» (plurar)

$this->set('categories',$this->Article->Category->find('list'))

, и вход в представлении должен быть:

echo $this->Form->input('category_id');

не забудьте также изменить внешний ключ в модели

Надеюсь, это поможет:)

...