我尝试了CakePHP 3.x" Bookmaker教程"我一步一步地按照说明进行操作。不幸的是,在第一章的最后我得到了附加的错误:
Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #8 of SELECT list
is not in GROUP BY clause and contains nonaggregated column 'wis.Tags.id' which is not
functionally dependent on columns in GROUP BY clause; this is incompatible with
sql_mode=only_full_group_by
此外,我得到的信息可以检查我的" BookmarksTags"桌子,但我不必创建一个。我有点困惑。
Please try correcting the issue for the following table aliases:
BookmarksTags
我已经谷歌我的问题,我找到了更新" my.cnf"额外的一条线。我已经尝试但没有发生任何事情。我还检查了拼写并下载了#34; bookmarker-tutorial"从github但我仍然得到上面的错误。
我使用MySQL 5.7.11和PHP 5.6.14。
答案 0 :(得分:20)
这是MySQL 5.7中的新功能,并且警告您的查询不明确。
考虑下表:
id | name | age | points
--------------------------------------------
1 Bob 21 1
2 James 14 1
3 Bob 21 3
4 James 14 2
5 Casey 17 3
如果您执行了以下查询:
SELECT name, age, SUM(points) FROM scores GROUP BY name
然后name
列用于分组。请注意,age
可能有多个值,因此它是“非聚合的”。你需要做一些事情来摧毁这些价值观。
5.6和之前的行为是根据排序顺序选择第一个,尽管这有时是不可预测的并且会失败。在5.7中,他们首先阻止你这样做。
此处的解决方案是对其进行分组,或者将MIN()
等聚合运算符应用于此。
答案 1 :(得分:13)
我使用Laravel 5.4并遇到同样的问题
我尝试在strict
上将false
设置为config/database.php
,然后就可以了。
'connections' => [
'mysql' => [
'strict' => false,
]
]
然而,编辑sql查询比抑制它的警告更好。
答案 2 :(得分:2)
这可能是与MySQL的新版本相关的问题,因为您说您使用的是MySQL 5.7.11 因此,要为您的所有网站解决此问题,请参阅此
社区的答案添加以下行
String
/etc/mysql/my.cnf文件&拯救它;并在重新启动服务器后
[function1]
会做的工作
答案 3 :(得分:1)
偶然发现了同样的问题
在不更改查询的情况下使教程“正常”的简单方法可能是重置sql_mode
中的config/app.php
:
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
...
'init' => ["SET sql_mode = ''"],
],
虽然这应该可以使事情有效,但在现实生活中可能不建议这样做。
答案 4 :(得分:1)
除了tadman的评论之外,对于您所关注的教程,您应该通过Bookmarks.id和BookmarksTags.tag_id来区分您的sql select查询,而不仅仅是Bookmarks.id
为此,在BookmarksTable.php文件中,行
->distinct(['Bookmarks.id'])
应该看起来像
->distinct(['Bookmarks.id', 'BookmarksTags.tag_id'])