0

我正在使用 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 子句。

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

1 回答 1

0

从用户模型方向来看,这会更容易。实际上,您是在要求 Cake 获取该用户拥有的所有用户详细信息和活动详细信息。

所以你会有更多类似的东西:

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

根据 Cake 的约定,owner_fk 字段应该是 user_id - 并且应该设置 Activity 模型与用户的 belongs_to 关系来定义所有者。

然后设置 User 模型有一个 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

确实需要一些时间来适应,但遵循约定确实很有帮助。

于 2013-03-05T05:16:10.337 回答