sql >> データベース >  >> RDS >> Mysql

同じテーブルへの複数の外部キーGasOrm

    このトピックがまだ最新で、一部の人にとって興味深いものであるかどうかはわかりませんが、一般的に、まったく同じ問題が発生しました。

    私はGasORMをCodeIgniterと組み合わせたマッパーにすることにしました。私のデータベース構造が与えられ、Gasのtable_pk規則に従っていないため、外部キーを定義する必要がありました。 カスタムデータベースの外部キーを参照する自分自身。ただし、その定義は何にも影響を与えませんでした。上記のエラーのように、マッパーは正しいSQLステートメントを作成できませんでした。ステートメントはあなたのステートメントと似ています:

       SELECT * FROM partner WHERE partner.pool_id IN (1)
    

    そうですね、Gasは自己定義の外部キーを無視し、デフォルトのtable_pk規則を使用しようとしているようです。つまり、テーブル(この場合はpool)と主キー(id)をアンダースコア文字とマージして取得します。

    orm.phpのコンストラクターであることがわかりました エンティティ内で定義されたすべての主キーと外部キーを処理します。 191行目で、コードはempty と組み合わせたif句を呼び出しています。 phpの機能。主キーは常に定義されており、ステートメントに否定がないため、毎回句の内部をスキップします。ただし、内部は自己定義の外部キーを処理します。

    簡単に言うと、否定を追加しました (!)orm.phpの191行目で、次のコードが表示されます:

    if ( ! empty($this->primary_key))
        {
            if ( ! empty($this->foreign_key))
            {
                // Validate foreign keys for consistency naming convention recognizer
                $foreign_key = array();
    
                foreach($this->foreign_key as $namespace => $fk)
                {
                    $foreign_key[strtolower($namespace)] = $fk;
                }
    
                $this->foreign_key = $foreign_key;
            }
            else
            {
                // If so far we didnt have any keys yet, 
                // then hopefully someone is really follow Gas convention
                // while he define his entity relationship (yes, YOU!)
                foreach ($this->meta->get('entities') as $name => $entity)
                {
                    if ($entity['type'] == 'belongs_to')
                    {
                        $child_name     = $entity['child'];
                        $child_instance = new $child_name;
                        $child_table    = $child_instance->table;
                        $child_key      = $child_instance->primary_key;
    
                        $this->foreign_key[strtolower($child_name)] = $child_table.'_'.$child_key;
                    }
                }
            }
        }
    

    さて、この小さな修正は私を大いに助けてくれました、そしてあなたの何人かがこのヒントも利用できることを願っています。




    1. 2 jQueryまたはAjaxを使用したオートコンプリート/提案入力ボックスと、複数のアイテムを含む最初の選択に基づく2番目のボックス

    2. MS-SQLServerのエイリアス列でGROUPBYを実行するにはどうすればよいですか?

    3. 1つずつ実行できないcodeigniterで複数のクエリを実行する

    4. Laravel:クエリ結合をネストするとサブ配列になります