エラーが発生するコード
src/Controller/SamplesController.php
<?php
//・・・省略
use Cake\ORM\TableRegistry;
class SamplesController extends AppController
{
$articlresTable = TableRegistry::getTableLocator()->get('Articles');
$articlre = $ArticlresTable
->find()
->contain([''Categories'])
->where(['id'=>2])
->first();
//エラー発生「Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous」
原因
where句で指定している「id」が、親テーブル「Articles」にもContainで取得している子テーブル「Categories」にも存在することが原因です。
「idって、Articles?Categories?どっちのテーブルのidやねん!」と怒られています。
解決策
以下のように、where句にArticlesテーブルのIDを利用することを明記します。
<?php
//・・・省略
use Cake\ORM\TableRegistry;
class SamplesController extends AppController
{
$articlresTable = TableRegistry::getTableLocator()->get('Articles');
$articlre = $ArticlresTable
->find()
->contain(['Categories'])
//修正点。Articlesのidであることを明記する。
->where(['Articles.id'=>2])
->first();
//エラー発生「Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous」
その他の発生事例
以下のようなコードでも同様のエラーが発生しました・・・
※今回はcontainで取得されるCategoriesをwhere句の検索条件にしています。
$articlresTable = TableRegistry::getTableLocator()->get('Articles');
$articlre = $ArticlresTable
->find()
->contain(['Categories']=> function ($q) {
//ここのwhere句でエラー。
return $q-> where(['id'=>2]);
})
->first();
「Contain句内にwhere句があるんだからCategoriesテーブルの話だってわかるだろ!」という気もしますが・・・。
まあ、怒っても仕方ないので、大人しく下記のように修正したのでした。
$articlresTable = TableRegistry::getTableLocator()->get('Articles');
$articlre = $ArticlresTable
->find()
->contain(['Categories']=> function ($q) {
//修正点。Categoriesのidであることを明記する。
return $q-> where(['Categories.id'=>2]);
})
->first();
参考
EasyRamble:Integrity constraint violation:Column ‘created’ in order clause is ambiguousエラー/CakePHP
コメント