我在编写返回我正在寻找的记录的 CakePHP find() 时遇到问题。
我的联想是这样的:
用户 ->(有很多)-> 好友 ,
用户 ->(有很多)-> 帖子
我正在尝试显示一个用户的所有 friend 最近发布的列表,换句话说,列出当前登录用户的 friend 创建的每个帖子。
我能想到的唯一方法是将所有用户的 friend 的 user_id 放在一个大数组中,然后遍历每个数组,这样 find() 调用看起来像这样:
$posts = $this->Post->find('all',array(
'conditions' => array(
'Post.user_id' => array(
'OR' => array(
$user_id_array[0],$user_id_array[1],$user_id_array[2] # .. etc
)
)
)
));
我觉得这不是最好的做事方式,就好像该用户很受欢迎,这是很多 OR 条件。谁能提出更好的选择?
澄清一下,这是我的数据库的简化版本:
“用户”表
编号
用户名
等等
“ friend ”表
编号
用户编号
friend_id
等等
“帖子”表
编号
用户编号
等等
最佳答案
在回顾了你重写的内容之后,我想我明白你在做什么。您当前的结构将不起作用。 POSTS 中没有对 friend 的引用。因此,根据您发布的架构, friend 不能添加任何帖子。我认为您要做的是将 friend 称为其他用户之一。意思是,用户 FRIEND 实际上只是 USERS 表中的另一个 USER。这是一个自引用的 HABTM 关系。所以这是我的建议:
1- 首先,确保您在数据库中创建了 HABTM 表:
-- MySQL CREATE TABLE
users_users
(user_id
char(36) NOT NULL,
friend_id
char(36) NOT NULL );
2- 在用户模型中建立关系。
var $hasAndBelongsToMany = array( 'friend' => array('className' => 'User', 'joinTable' => 'users_users', 'foreignKey' => 'user_id', 'associationForeignKey' => 'friend_id', 'unique' => true, ), ); var $hasMany = array( 'Post' => array( 'className' => 'Post', 'foreignKey' => 'user_id' ), );
3- 使用脚手架插入一些记录、链接 friend 和添加帖子。 4- 将查看记录功能添加到用户 Controller :
function get_user($id) { $posts = $this->User->find('first', array( 'conditions' => array('User.id' => $id), 'recursive' => '2' )); pr($posts); }
5- 现在您可以使用以下命令使用递归查询用户表以提取记录:
6- 当您 pr($posts) 时,您的输出将显示所有记录(递归地),包括 friend 及其在返回的数据树中的帖子
我知道这是一篇很长的文章,但我认为它将为您尝试做的事情提供最佳解决方案。 CakePHP 的强大功能令人难以置信。杀死我们的是学习曲线。
编码愉快!
关于php - 如何在不执行一长串 "OR"条件的情况下找到模型的所有记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2402059/