2

すでにデータベース(MySQL)が存在するCakePHP2.2.3でWebアプリを開発しています。このデータベースはスペイン語であるため、私のアプリはスペイン語であり、「エラー:モデルオーデンのテーブルオーデンがデータソースのデフォルトで見つかりませんでした」というエラーが表示されます。

私のモデル:

Orden.php

class Orden extends AppModel{
    public $name = 'Orden';
    public $useTable = 'ordenes';
    public $primaryKey = 'idorden';

}

テーブル:

CREATE TABLE IF NOT EXISTS `ordenes` (
  `idOrden` bigint(20) NOT NULL AUTO_INCREMENT,
  -- more columns --
  PRIMARY KEY (`idOrden`)
)

APP / config / database.php

class DATABASE_CONFIG {

public $default = array(
    'datasource' => 'Database/Mysql',
    'persistent' => false,
    'host' => 'localhost',
    'login' => 'USER',
    'password' => 'PASS',
    'database' => 'DATABASE',
    'prefix' => '',
    //'encoding' => 'utf8',
);

}

ドキュメントによると、対応するテーブルで$ useTableを宣言できますが、これは機能しません。誰か助けてもらえますか?

編集:同じ問題$primaryKeyがありますが、変数$nameには正しい値があります。

4

4 に答える 4

1

私は半分の醜い解決策を見つけました。次のコードを確認してください。

class OrdenesController extends AppController{

    public $name = 'Orden'; 
    public $uses = array('orden'); 
    public $helpers = array('Html', 'Form');

    public function index(){
        $this->orden->useTable = 'ordenes';
        $this->set('ord', $this->orden->find('all'));      
    }
}

に変数を設定する$useTableOrdenesController、Ordenesの配列を取得できます。誰か教えてもらえますか?

于 2012-10-25T00:23:41.567 に答える
1

あなたはあなたの質問に対する答えを見つけました。あなたにとって有効な部分的な解決策がありますが、実際にはそれはどのような場合でも機能しない回避策です。

私は質問に答えたかった:

$useTableOrdenesControllerで変数を設定すると、Ordenesの配列を取得できます。理由を教えてもらえますか?」

あなたがあなた自身の解決策で尋ねたこと(まだコメントできません)

最初の1つの重要な注意事項CakePHPはエラーをスローします:

Error: Table <table name> for model <model name> was not found in datasource default.

  1. <table name>モデルのテーブル<model name>がデータソースのデフォルトで見つからなかった場合(明らかに)
  2. しかし、cakePHPがモデルを見つけられない場合もあり<modelname>、これは非常に混乱する可能性があります。

モデルで何をしたかが機能する理由は、コントローラーで次のように記述しているためです。

public $uses = array('orden');

CakePHPは、$ this-> orderをモデルとして想定し、Modelフォルダー内でモデルの順序を見つけようとします(CakePHPが検索するファイルはorder.phpであり、 Order.phpではないことに注意してください。また、クラスがorderと呼ばれることも期待されます。モデルのクラス名設定を変更できますが、順序付けではありません$name)。

モデルが見つかると、モデルのデフォルト設定または設定セット(あなたの場合は$useTable$primaryKey)からデータを取得しようとします。
テーブルが見つからない場合は、テーブルが見つからないという事実を正しく示すエラーメッセージが表示されます。

しかし、モデルが見つからない場合、cakePHPは、設定が行われていないため、この場合はデフォルト値を使用してモデルをインスタンス化しようとします(モデルは「オンフライ」でインスタンス化されます)。これは、デフォルトをデータソースとして使用し、英語の複数形のordenであるということを意味します。ordenscakePHPはordensテーブルを見つけようとします(これは、cakePHPがモデルのテーブルに名前を付けるための標準的な方法であり、ordenは英語の単語ではありません)。このテーブルはデフォルトのデータソースにないため、エラーがスローされますが、実際のエラーは存在しないファイルです。

モデルの値を変更する$useTableと、標準の代わりに使用されると思いましたが、cakePHPはモデルOrdenを使用していませんが、エラーメッセージが示すようにモデルordenを見つけることができないため、「オンフライ」でインスタンス化されたモデルordenを使用しています(クラスは、 ordenではなくOrdenと呼ばれます)。

そのため、デフォルトモデル(たとえば、findなど)によって移植されたデフォルト操作はすべて機能します。
次に、それを呼び出し$this->orden->find('all')て完全に機能しますが、モデル(Ordenを使用していると思われる関数)に関数を作成して呼び出すと、 「オンフライ」バージョンには存在しないため、エラーが発生します。

このため、回避策は機能しますが、部分的にしか機能しません。

于 2015-11-16T09:24:48.453 に答える
0

テーブルがデフォルトのデータソースに存在しますか?CakePHPは、複数のデータソースを使用して複数の接続を処理できます(を参照APP/config/database.php

正しくありませんが、問題とは何の関係もありませんpublic $primaryKey = 'idorden';。MySQLコードを見ると、次のようになっているはずです。public $primaryKey = 'idOrden';

デバッグモードをオンにしていますか?でキャッシュをフラッシュしてみてください/APP/tmp/cache

おそらく、テーブルプレフィックスを使用していて、データベース内のテーブルにプレフィックスが付いていませんか?

エラーメッセージをコピーして貼り付けましたか?モデルがスモールキャップスで書かれている可能性は低いです。

$useTableまた、無関係な単語を使用して、カスタムの単数形および複数形の単語を定義することもできます。http://book.cakephp.org/2.0/en/development/configuration.html#inflection-configurationを参照してください

ただし、データベース構成を確認するか、コードを表示して、複数のデータソースを使用しているかどうかを確認してください。それ以外の場合は、mysqlプロンプトまたはphpMyAdminなどのツールを使用して、テーブルが実際に存在するかどうかを確認してください。

于 2012-10-24T20:08:29.303 に答える
-1

私もこの問題に遭遇しました。理由は私のモデルのphpファイル名ですが、usesarrayScheduleAd.php"ScheduleAD"に作成しました。

public $uses = array('ScheduleAD');

したがって、モデルファイル名とモデルクラス名、および$uses配列の名前が完全に等しいかどうかを確認してください:)

于 2014-05-15T16:03:21.750 に答える