Cakephp hasmany отношения выдают ошибку

У меня есть база данных с некоторыми отношениями. У меня есть две таблицы в этом примере:

activity_ingredients   ingredient_aliases
---------------        ---------------
id                     id
ingredient_id          ingredient_id

Я хочу внести в свою модель условия для соединения таблиц по полю "ingredient_id". Я сделал в этом режиме:

class ActivityIngredients extends AppModel{
        public $name = 'ActivityIngredients'; 
        public $useTable = 'activity_ingredients';

        public $hasMany = array (
        'IngredientAlias' => array (
            'className'     => 'IngredientAlias',
            'foreignKey'   => false,
            'conditions' => array('ActivityIngredients.ingredient_id = IngredientAlias.ingredient_id')
        )
        );
    }   

class IngredientAlias extends AppModel {

    public $name = 'IngredientAlias';
    public $useTable = 'ingredient_aliases';
    public $belongsTo = array(
         'ActivityIngredients' => array(
            'className'    => 'ActivityIngredients',
            'foreignKey'   => false
        )

    );  
} 

Если я напишу этот код, выдайте мне такую ​​​​ошибку:

Столбец не найден: 1054 Неизвестный столбец «ActivityIngredients.ingredient_id» в «предложении where»

Но если вместо hasMany я напишу hasOne, он не вернет никакой ошибки и будет идеальным. Но мое отношение hasMany.. почему?

Чтобы получить данные, я делаю запрос в свой UserController. Пользователь связан с Activity с hasMany, Activity связан с ActivityIngredients в этом режиме:

public $hasOne = array(
            'ActivityIngredients' => array(
                'className' => 'ActivityIngredients',
                'conditions' => '',
                'dependent' => true,
                'foreignKey'   => 'activity_id'
            )

Чтобы получить данные, я использую этот запрос в данный момент, но я думаю, что теперь мне нужно изменить весь запрос

$this->User->Activity->recursive = 2;
        $activity = $this->User->Activity->findAllByUser_id($id);
        $this->set('activity', $activity);

person Community    schedule 24.07.2012    source источник


Ответы (2)


Первое, что вы должны использовать в единственном числе при определении класса модели. Это означает, что имя модели должно быть ActivityIngredient вместо ActivityIngredients.

Хотя если в таблице activity_ingredients, если ingredient_id id является внешним ключом, принадлежащим таблице ingredient_aliases. Тогда он должен быть назван как ingredient_alias_id. Точно так же, если бы вы сделали то же самое в таблице ingredient_aliases, то есть имя внешнего ключа было бы activity_ingredient_id. Тогда вообще не будет проблем.

Тем не менее, я даю решение вашей проблемы. Пожалуйста, проверьте и проверьте.

Тогда ваш код должен выглядеть так:

class ActivityIngredient extends AppModel{
    public $name = 'ActivityIngredient'; 
    public $useTable = 'activity_ingredients'; // if you use singular term then no need to define $useTable

    public $hasMany = array (
    'IngredientAlias' => array (
        'className'     => 'IngredientAlias',
        'foreignKey'   => false,
        'finderQuery' => 'select * from ingredient_aliases as `IngredientAlias`
                          where `IngredientAlias`.`ingredient_id` = {$__cakeID__$}'
                               )
    );
}   

class IngredientAlias extends AppModel {

    public $name = 'IngredientAlias';
    public $useTable = 'ingredient_aliases';
    public $belongsTo = array(
                      'ActivityIngredient' => array(
                                   'className'    => 'ActivityIngredient',
                                   'foreignKey'   => 'ingredient_id' 
                                                   )
                             );  
} 
person Arun Jain    schedule 25.07.2012
comment
С этим кодом данные не извлекаются, IngredientAlias ​​пуст, не принимает правильную ассоциацию... - person ; 25.07.2012
comment
Есть ли какая-либо ошибка, которую вы получили, если нет, проверьте, есть ли у ингредиента_id соответствующие записи в таблице activity_ingredients или нет. - person Arun Jain; 25.07.2012
comment
Ошибок нет, но для меня сейчас проблема в запросе в мой контроллер. Поскольку я использую эту таблицу в контроллере пользователя, пользователь связан с Activity, Activity с ActivityIngredients и ActivityIngredients с IngredientAlias. Я сделал свой запрос в этом режиме: но с вашим режимом для меня это неправильно, верно? $this-›User-›Activity-›recursive = 2; $activity = $this-›User-›Activity-›findAllByUser_id($id); $this-›set('активность', $активность); - person ; 25.07.2012
comment
да ... хорошо, но вы не упомянули об этом в своем вопросе. Нет проблем. Как модель Activity связана с моделью ActivityIngredient? Пожалуйста, отредактируйте свой вопрос и объясните весь сценарий. - person Arun Jain; 25.07.2012
comment
Я отредактировал свой вопрос, указав дополнительную информацию, надеюсь, теперь все готово для решения моей проблемы. - person ; 25.07.2012

person    schedule
comment
Дайте мне сообщение об ошибке: Синтаксическая ошибка или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '=> IngredientAlias.ingredient_id' в строке 1 - person ; 25.07.2012