CakePHP与非常规数据库的关联

时间:2011-11-19 03:56:14

标签: cakephp associations database-relations

我们正在转换一个与CakePHP 2.0.3一起使用的应用程序。 出于某种原因,我似乎无法在我的模型之间建立适当的关系。

以下是一个例子:

  • 用户(id,petid,country,picid,...)
  • Pet(id,userid,picid,...)
  • 图片(id,albumid,....)
  • 专辑(id,userid,petid,...)

这些含义如下:   - 用户可以拥有多只宠物,但只能同时选择一只宠物(因此,用户使用petid)

  - 宠物属于一个用户

  - 宠物和用户可以有多张图片,但只有一张个人资料图片,因此Pet.picid和User.picid

  - 宠物和用户可以有多个专辑

我在CakePHP中设置了我的模型,但我无法弄清楚它们之间使用哪些关系,因为数据库没有遵循约定。 我尝试了以下内容:

  • 用户
    - >的hasMany(宠物)
    - > hasOne(图)
    - >的hasMany(专辑)

  • 宠物
    - > belongsTo(用户)(工作正常,使用foreignkey userid)
    - >的hasMany(专辑)
    - > hasOne(图片)

  • 相册
    - >的hasMany(图片)

----逻辑实现这一目标?它要么属于用户,要么属于宠物-----

- >属于关联(用户)
    - >属于关联(PET)

  • 图片
    - >属于关联(专辑)

我是CakePHP的新手,无法想办法走到这里。 你有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我建议您在关系中使用Aliases,以帮助您了解返回的数据。

例如,您的用户模型可以在其关联中使用 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
    )
);

您的宠物模型也可以使用 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
    )
);

关于属于用户宠物相册的逻辑,您可以在保存时在控制器中处理此问题数据或返回它。 I.e用户优先于宠物。

我希望这会有所帮助。