在模型中组合$ hasOne和$ hasAndBelongsToMany - 这可能/合法吗?

时间:2013-03-05 00:31:34

标签: cakephp

我正在使用cakephp 2.3.0。我在手册中搜索了很长一段时间,我也搜索了google / stackoverflow。

我对cakephp还有些新鲜感。我一直在努力让$ hasAndBelongsToMany(多对多)工作,我确实让它工作......哇哇。但是,使用相同的模型,我无法在下面的工作中获得以下方案。

我有活动和用户模型。活动可以包含许多用户。用户可以进行许多活动。但是,我想在我的网页上显示活动列表以及活动的所有者,所有这些都在表格的一行中。

活动表包括以下列,其中包括:

  • ID
  • 名称
  • 状态
  • owner_fk(Users.id的外键)

用户表包括以下列,其中包括:

  • ID
  • 用户名
  • 密码
  • 作用

我的SQL看起来像:

select usr.username, actv.name 
from users usr, activities actv
where usr.users_id = actv.owner_fk

活动模型(用户模型有类似的代码):

class Activity extends AppModel {   
    var $name = 'Activity';

    public $hasAndBelongsToMany = array(
    'User' =>
        array(
            'className'              => 'User',
            'joinTable'              => 'activities_users',
            'foreignKey'             => 'activities_id',
            'associationForeignKey'  => 'users_id',
            'unique'                 => false,
            'conditions'             => '',
            'fields'                 => '',
            'order'                  => '',
            'limit'                  => '',
            'offset'                 => '',
            'finderQuery'            => '',
            'deleteQuery'            => '',
            'insertQuery'            => ''
        )
    );

我不确定CakePHP是否允许在同一模型中混合/匹配,例如......在同一模型中拥有$ hasOne并且还具有$ hasAndBelongsToMany。可能有一种简单的方法来实现我想要做的事情和/或最佳实践。我已经尝试了一些,但到目前为止没有运气。

我想在我的控制器中执行下面的代码,但是在上面的SQL中使用where where子句这样的条件。

$this->set('results', $this->Activity->find('all'));

1 个答案:

答案 0 :(得分:0)

用户模型方向会更容易。真的,你要求Cake为你提供所有的用户细节和信息。该用户是所有者的活动详细信息。

所以你会有更多的东西:

$this->set('primary_user_with_activity', $this->Activity->User->find('all'));

根据Cake约定,owner_fk字段应为user_id - 并且应该使用belongs_to关系设置Activity模型以定义所有者。

然后将用户模型设置为具有has_one关系以匹配活动模型中的belongs_to

如果您想添加has_and_belongs_to_many关系,可以这样做 - 给它一个与belongs_to关系不同的别名。

 public $hasAndBelongsToMany = array(
        'People' => array(
            'className' => 'User',
        )
    );

此处有更多详情: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

确实需要一些人习惯,但遵循惯例确实有帮助。