使用find语句和连接表列出数据

时间:2012-04-09 18:42:36

标签: php cakephp

我的CakePHP应用程序有以下表格,允许用户之间建立友谊:

**Users**
id
username
password

**Profiles**
id
firstname
lastname
user_id

**Friends**
id
user_id_to
user_id_from
status

所以基本上用户有一个配置文件,用户可以和另一个用户成为朋友,并且这被记录在名为friends的数据库表中,其简单状态为已确认或未使用0或1(它是一个int)。所以朋友是两个用户之间的联系。

我正在尝试为用户列出朋友,例如,如果我得到的网址如下:

/people/cameron/friends它会列出用户Cameron的朋友。

然而,我正在努力使用find语句来传递用户并找到它们(注意我包含配置文件数据),然后列出与该用户相关的朋友。有人可以帮忙吗?

这些是朋友,用户和个人资料模型:

class Friend extends AppModel
{
    public $name = 'Friend';

    public $belongsTo = array('User');

    public $actsAs = array('Containable');

}

user.php的

   class User extends AppModel
    {
        public $name = 'User';

    public $hasOne = 'Profile';

    public $hasMany = array(
        'Post',
        'Answer',
        'Friend' => array(
            'foreignKey' => 'user_id_to'
        )
    );

public $belongsTo = array(
        'Friend' => array(
            'foreignKey' => 'user_id_from'
        )
    );

    public $actsAs = array('Containable');

        public function getFriends($username)
        {
        return $this->find('all',
        array('conditions' => array('User.username' => $username, 'Friend.status'=>1),
            'contain' => array('Friend' => array('User'))
        ));
        }
    }

Profile.php

class Profile extends AppModel
{
    public $name = 'Profile';

    public $belongsTo = 'User';

    public $actsAs = array('Containable');
}

这是我显示用户朋友列表的方法:

public function index( $username )
{   
    $friends = $this->User->getFriends($username);

    $this->set('friends', $this->paginate());
}

我目前收到此错误:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'User.user_id_from' in 'on clause'
SQL Query: SELECT `User`.`id`, `User`.`username`, `User`.`password`, `User`.`email`, `User`.`status`, `User`.`code`, `User`.`lastlogin`, `Friend`.`id`, `Friend`.`user_id_from`, `Friend`.`user_id_to`, `Friend`.`datetime`, `Friend`.`status` FROM `db52704_favorr`.`users` AS `User` LEFT JOIN `db52704_favorr`.`friends` AS `Friend` ON (`User`.`user_id_from` = `Friend`.`id`) WHERE `User`.`username` = 'cameron' AND `Friend`.`status` = 1

看起来应用程序认为外键在User表而不是朋友表中,即使他们在Friend关联中调用了......任何想法是什么问题?

2 个答案:

答案 0 :(得分:0)

在构造连接查询时,Cake似乎对这些foreignKey赋值感到困惑。

您可以尝试使用以下内容替换每个关系以强制使用右连接语句:

public $hasMany = array(
    'Friend' => array(
        'foreignKey' => null,
        'conditions' => array('Friend.user_id_to = User.id')
    )
);

public $belongsTo = array(
    'Friend' => array(
        'foreignKey' => null,
        'conditions' => array('Friend.user_id_from = User.id')
    )
);

答案 1 :(得分:0)

每次为$ belongsTo指定外键时,请记住您指定的名称是当前表中字段的名称,而不是其他表。

因此,例如,您对'foreignKey' => 'user_id_to'的$ belongsTo引用应该位于好友模型中,而不是用户模型。

重新阅读Cake的文档,因为它确实令人困惑(即使在多年的Cake应用程序之后,我仍需要在开始新项目时刷新):http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html