0

我在 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 实际上是我想要做的 - 尽管从我收集的内容来看, paginate 和 find('all') 在功能上非常相似)。

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

我在想我可能忽略了一些非常简单的事情,但感谢您提供任何帮助。谢谢!

4

2 回答 2

1

因此,根据我们的讨论,您遇到的问题与虚拟字段有关。查看文档,更具体地说是虚拟字段和模型别名以及virtualFields部分的限制。

根据您上面的描述,您似乎有一个连接指定了您的虚拟字段,这将导致您看到的错误,因为它会JOINFROM. 如果您坚持使用虚拟字段,我建议您重写它以使用子查询。确保您的子查询仅返回 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绑定必要的模型(如果需要)并更改查询参数。

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

于 2012-02-15T18:39:52.797 回答
0

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

find('all'),但是,运行不同的查询,如果您提供的 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来自什么,究竟是什么?),如果你没有自定义你的Itemor UserorApp模型,(设置$useTable = false可能?)你正在处理一个不寻常的错误。

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

于 2012-02-15T00:15:08.553 回答