行为find('count')和find('all')cakePHP之间的区别

时间:2012-02-14 22:29:40

标签: php cakephp model controller findall

我在CakePHP中遇到一个奇怪的问题

$this->something->find('count'); 

完美无缺,

$this->something->find('all'); 

什么都不返回(甚至不是空数组,任何错误或任何东西)。

编辑:结果我得到一个sql错误:" SQL错误:1054:未知列" - 对于确实存在的列。 (下面的sql查询中的users.display_name):

SELECT item.id, item.name, item.description, item.user_id, users.display_name FROM item LEFT JOIN users ON (item.user_id = users.id);

我也尝试过使用findAllBy和paginate(实际上我正在尝试使用paginate - 虽然我收集的内容,分页和查找(' all')非常相似功能)。

奇怪的是,find(' all')可以在其他任何地方运行 - 它只是在这个特定的控制器中,它表现得很奇怪。我没有收到任何错误,只是一个空洞的结果。

我认为我可能会忽略一些非常简单的事情,但感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

因此,根据我们的讨论,您遇到的问题是虚拟字段。请查看documentation,更具体地说,请查看virtual fields and model aliaseslimitation of virtualFields部分。

从上面的说明中看,您有一个指定虚拟字段的联接,这会导致您看到的错误,因为它会在JOIN之前添加FROM。如果你坚持使用虚拟字段,我建议你重写它以使用子查询。确保您的子查询只返回1列。

示例:http://web-development-blog.co.uk/2011/03/08/cakephp-virtual-field-count-another-modeltable/

public $virtualFields = array(
    'count' => 'SELECT COUNT(*) FROM stacks Stack'
);

或者,您可以使用Model::beforeFind绑定必要的模型(如有必要)并更改查询参数。

如果您无法弄明白,请发布您的模型,我会帮助您。

答案 1 :(得分:0)

您对行为差异的具体问题是find('count')将对您的数据库运行基本COUNT(*)查询以确定行数。

但是,

find('all')会运行不同的查询,如果您提供的SQL是它尝试使用的SQL,则它无效:

SELECT item.id, item.name, item.description, item.user_id, users.display_name LEFT JOIN users ON (item.user_id = users.id);

没有FROM声明(SELECT来自什么,确切地说?),如果您没有自定义ItemUserApp模型,(设置$useTable = false可能?)你正在处理一个不寻常的错误。

要注意的一件事是,如果这些模型在其他控制器中工作正常,则可以对每个控制器中每个模型的属性进行任何更改。除非每个控制器都有代码告诉它,否则它们在每个控制器的基础上不会采取不同的行为。