我在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')可以在其他任何地方运行 - 它只是在这个特定的控制器中,它表现得很奇怪。我没有收到任何错误,只是一个空洞的结果。
我认为我可能会忽略一些非常简单的事情,但感谢任何帮助。谢谢!
答案 0 :(得分:1)
因此,根据我们的讨论,您遇到的问题是虚拟字段。请查看documentation,更具体地说,请查看virtual fields and model aliases和limitation 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
来自什么,确切地说?),如果您没有自定义Item
或User
或App
模型,(设置$useTable = false
可能?)你正在处理一个不寻常的错误。
要注意的一件事是,如果这些模型在其他控制器中工作正常,则可以对每个控制器中每个模型的属性进行任何更改。除非每个控制器都有代码告诉它,否则它们在每个控制器的基础上不会采取不同的行为。