cakePHP 3.x "Bookmaker Tutorial"を試してみて、手順を追って説明しました。残念ながら、最初の章の最後に添付のエラーが表示されます。
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」を追加の行で更新する情報を見つけました。私はすでに試してみましたが、何もありませんでした。また、スペルをチェックし、gitbookから「bookmarker-tutorial」をダウンロードしましたが、上記のエラーが表示されます。
MySQL 5.7.11とPHP 5.6.14を使用します。
これは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以前の動作では、並べ替え順序に応じて最初の1つを選択するだけでしたが、これは予測不可能で失敗する場合がありました。 5.7では、彼らはあなたがそもそもそれをするのを妨げています。
ここでの解決策は、それをグループ化するか、MIN()
のような集約演算子をそれに適用することです。
Laravel 5.4を使用しており、同じ問題に直面しています。config/database.php
上のstrict
にfalse
を設定しようとしましたが、動作します。
'connections' => [
'mysql' => [
'strict' => false,
]
]
ただし、警告を抑制するよりも、SQLクエリを編集する方が適切です。
これは、MySQL 5.7.11を使用していると述べたように、MySQLの新しいバージョンに関連する問題である可能性があります。したがって、すべてのサイトでこの問題を解決するには、
以下の行を追加するコミュニティによる回答
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
/etc/mysql/my.cnfファイルに保存して保存します。サーバーを再起動した後
Sudo service mysql restart
仕事をするだろう
同じ問題につまずいただけです。
クエリを変更せずにチュートリアルを「機能させる」簡単な方法は、sql_mode
in config/app.php
:
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'Host' => 'localhost',
...
'init' => ["SET sql_mode = ''"],
],
これにより物事が機能するはずですが、実際のケースではおそらく推奨されません。
Tadmanのコメントに加えて、チュートリアルでは、Bookmarks.idだけでなく、Bookmarks.idとBookmarksTags.tag_idの両方でSQL選択クエリを区別する必要があります。
これを行うには、BookmarksTable.phpファイルの次の行
->distinct(['Bookmarks.id'])
のように見えるはずです
->distinct(['Bookmarks.id', 'BookmarksTags.tag_id'])