Ассоциации в CakePHP с нетрадиционной базой данных - PullRequest
1 голос
/ 19 ноября 2011

Мы конвертируем приложение для использования с CakePHP 2.0.3. По какой-то причине я не могу установить правильные отношения между моими моделями.

Вот пример:

  • Пользователь (id, petid, страна, picid, ...)
  • Pet (id, userid, picid, ...)
  • Изображение (id, albumid, ....)
  • Альбом (id, идентификатор пользователя, petid, ...)

Их значения следующие: - У пользователя может быть несколько домашних животных, но он может выбрать только одного домашнего животного одновременно (следовательно, petid в User)

- Домашние животные принадлежат одному пользователю.

- Домашние животные и пользователи могут иметь несколько изображений, но только одну фотографию профиля, поэтому Pet.picid и User.picid

- Домашние животные и пользователи могут иметь несколько альбомов.

Я настроил свои модели в CakePHP, но не могу понять, какие отношения использовать между ними, поскольку База данных не соответствует соглашениям. Я пробовал следующее:

  • Пользователь
    -> hasMany (Домашние животные)
    -> hasOne (Фото)
    -> hasMany (Альбом)

  • Pet
    -> assignTo (пользователь) (работает нормально, с идентификатором пользователя Foreignkey)
    -> hasMany (Альбом)
    -> hasOne (Фото)

  • Альбом
    -> hasMany (Фото)

---- Логика для этого? Он либо принадлежит пользователю, либо домашнему животному -----

-> ownTo (Пользователь)
-> принадлежит (домашнее животное)

  • Изображение
    -> принадлежит (альбом)

Я новичок в CakePHP и не могу понять, как сюда добраться. У вас есть какие-нибудь предложения?

1 Ответ

0 голосов
/ 19 ноября 2011

Я бы предложил использовать Псевдонимы в ваших отношениях, что поможет вам обдумать возвращаемые данные.

Например, ваша модель Пользователь может использовать SelectedPet и ProfilePicture в своих ассоциациях:

Модель User.php

/**
* belongsTo associations
*
* @var array
*/
public $belongsTo = array(
    'SelectedPet' => array(
        'className' => 'Pet',
        'foreignKey' => 'petid'
    ),
    'ProfilePicture' => array(
        'className' => 'Picture',
        'foreignKey' => 'picid',
    )
);

/**
* hasMany associations
*
* @var array
*/
public $hasMany = array(
    'Album' => array(
        'className' => 'Album',
        'foreignKey' => 'userid',
        'dependent' => false
    ),
    'Pet' => array(
        'className' => 'Pet',
        'foreignKey' => 'userid',
        'dependent' => false
    )
);

Ваша модель Pet может также использовать ProfilePicture :

/**
 * belongsTo associations
 *
 * @var array
 */
    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'userid'
        ),
        'ProfilePicture' => array(
            'className' => 'Picture',
            'foreignKey' => 'picid'
        )
    );

/**
 * hasMany associations
 *
 * @var array
 */
    public $hasMany = array(
        'Album' => array(
            'className' => 'Album',
            'foreignKey' => 'petid',
            'dependent' => false
        )
    );

Изображение модель:

/**
 * belongsTo associations
 *
 * @var array
 */
    public $belongsTo = array(
        'Album' => array(
            'className' => 'Album',
            'foreignKey' => 'albumid'
        )
    );

.. и, наконец, ваш альбом модель:

/**
 * belongsTo associations
 *
 * @var array
 */
public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'userid'
    ),
    'Pet' => array(
        'className' => 'Pet',
        'foreignKey' => 'petid'
    )
);

/**
 * hasMany associations
 *
 * @var array
 */
public $hasMany = array(
    'Picture' => array(
        'className' => 'Picture',
        'foreignKey' => 'albumid',
        'dependent' => false
    )
);

Относительно логики Альбом , принадлежащего пользователю или Pet , вы можете просто обработать это в своем контроллере при сохранении данных или их возврате.Т.е. пользователю дается предпочтение перед питомцем.

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

...