【发布时间】:2019-06-22 13:43:23
【问题描述】:
我在这个简单的查询中得到“发生内部服务器错误”:
$query = $this->find()
->contain(['CatLang' => function(Query $q) use($i18n){
return $q->where(['CatLang.i18n' => $i18n]);
}])
->where(['Categories.id' => $categoryId]);
$category = $query->first();
表格看起来像这样,简化后:
categories
id
cat_lang
category_id
i18n
模型被命名为 CategoriesTable 和 CatLangTable,都扩展了 Table。
CatLangTable 属于类别:
$this->belongsTo('Categories');
..and 类别有很多 CatLangs:
$this->hasMany('CatLang');
查询是从 CategoriesTable 中的函数运行的。 mysql 中的工作查询如下所示:
SELECT * FROM categories AS c
INNER JOIN cat_lang as cl ON cl.category_id=c.id
WHERE c.id=13
AND cl.i18n='sv'
此查询将从 id 为 13 的类别中的一行返回结果集,并与 cat_lang 中的一行连接,其中 i18n 等于“sv”。 (category_id 和 i18n 具有唯一索引。)
谁能给我建议,我做错了什么?
使用 cakephp 3.5.17、php 7 和 mysql 5.7。
【问题讨论】:
-
要获取有关错误的更多详细信息,enable debug mode,并检查您的错误日志。
-
我把它打开了,我得到了这个:错误:[TypeError] 传递给 App\Model\Table\CategoriesTable::App\Model\Table\{closure}() 的参数 1 必须是一个实例App\Model\Table\Query 的实例,Cake\ORM\Query 的实例,在第 195 行的 vendor\cakephp\cakephp\src\ORM\Association\Loader\SelectLoader.php 中调用。
-
这意味着您没有 imported 名称(正确地)在
$q参数的闭包类型提示中使用。在类型提示中使用完全限定名称,即\Cake\ORM\Query $q,或将其添加到您的导入中,即use Cake\ORM\Query。 -
谢谢 ndm,我忘记了。我刚刚尝试过,但令我失望的是,没有任何变化。我添加了“使用 Cake\ORM\Query;”和“使用 Cake\ORM\Table;”在文件的顶部,无济于事。顺便提一句。我实际上是从文档中复制代码:book.cakephp.org/3.0/en/orm/…
-
ndm!它确实奏效了。我添加了一些破坏代码的调试。您可以发布您的答案,以便我将其标记为正确答案吗?非常感谢!
标签: php mysql cakephp-3.0