Integrity constraint violation: 1052 Column ‘id’ in where clause is ambiguous エラーについて【CakePHP4】

エラーが発生するコード

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

コメント

タイトルとURLをコピーしました