2012-02-25 8 views
4

私は現在phpとmysqlで簡単なORMを書こうとしています。私はormクラスが結合されたテーブルで作業できるようにします。 これは私の問題です。次のコードは、クエリが生成するデータを配列にマップする方法を示しています。PHPでの単純なORM MySQLの更新でテーブルが結合されました

public function execute_query($db_connection) 
{ 
    $query = ''; 

    foreach($this->sql_query as $query_part) 
     $query .= $query_part; 

    $result = $db_connection->query($query); 
    while($row = $result->fetch_assoc()) 
    { 
     array_push($this->m_Data, $row); 
    } 
} 

db_connectionはmysqliオブジェクトです。 sql_queryには、すべての異なるクエリ部分が含まれています(例:sql_query ['join']など)。 m_Dataは、dbから読み取られたデータを含む配列です。

私の特定の問題は、私のクエリでjoinステートメントを使用しているときです。この関数は、m_Data配列内の同じ名前のフィールドをオーバーライドします。また、特定のフィールドのデータが来ているテーブルの名前を保存しないと、後で同じ結合ステートメントでテーブルを更新できません。

tl、dr。私はこのようにテーブルのデータを保存するだけでなく、m_Data {'field_name' => 'value'}でもテーブルの名前を保存する必要があります。私はその後、このm_Data {'table_name.field_name' => 'value'}のようなデータを保存して、後で結合テーブルを正常に更新するためのクエリを生成することができました。

私は、結果を引き出す各フィールドの元テーブル名を取得する方法に関する情報を見つけることができないようです。

mysqliで可能なら、正しい方向に私を指摘すれば嬉しいです。

余計な問題文: 結果セットを取得し、各行を別々に読み取る必要があります。各行に対して、選択されたすべてのフィールドについて、field_name、table_name、valueという情報が必要です。

これには簡単な答えが必要ですが、解決策を見つけるために間違ったキーワードを探しているようです。

事前にお問い合わせいただきありがとうございます。私はこれを十分に理解していただきたいと思います。

+0

私は答えを追加しましたが、それはあるかもしれませんあなたがイントネーションしているかどうかを明確にしたい場合に便利ですdを使用すると、Propelのようなビルドプロセスから、またはDB構造をリアルタイムでクエリすることで、テーブルごとに列名を保持できます。 – halfer

+0

ちなみに、私はあなたが経験のためにこれをやっていることを願っています! PHP用の新しいORMを書いているのであれば、そこに*たくさんの*があることに気をつけてください。ホイールを再開発していないことを確認してください:) – halfer

+0

はい私は経験のためだけです。私は今かなりの時間phpで作業をしていませんでしたが、私はOOスタイルで使ったことはありません。だから、私は現在、単純なMVCフレームワークとこのORMを構築して問題に取り組んでいます。私は、プロジェクトに飛び込んで、私が直面している問題を克服することで最高の学習をしています。もう一度あなたの助けに感謝:) – wacki

答えて

0

テーブルの列の値をオブジェクトに格納する必要があるので、関連するテーブルがある場合は、列の値が別のオブジェクトに格納されるため、プライマリテーブルの値に干渉しません。

一般的にはあなたがORMでこのように動作可能性がある:あなたがあなたのクエリオプションを設定する方法に応じ

// Make joined query 
$rows = ... 

foreach($rows as $row) 
{ 
    // $row just refers to the primary table 
    echo $row->id; 

    // You get a many:1 related table this way 
    echo $row->getRelatedRow()->value; 

    // You get a 1:many rows this way 
    $rows = $row->getOtherRelatedRows(); 
} 

、関連するデータを取得することや、必要なデータを取得するために、さらにSELECT文を開始しない場合があります。

+0

それは良いと思う、私はそれをやろうと思う。しかしそれはまだ私の些細な根本的な問題を残している。 mysqliオブジェクトの結果セットのうち、行内のフィールドの3つのデータ値(テーブル名、フィールド名、値)を読み取るにはどうすればよいですか?その可能性がない場合、私はいくつかの他の方法に問題はない。私はこれを行う方法に関する情報を見つけることができませんでした。私が得た最も近いのは、行全体のテーブル名を読み込むことです。あなたが2つのテーブルを結合しても同じではないでしょう。 – wacki

+0

既知のテーブル構造についてのあなたの質問に私のコメントを参照してください。あなたのORMがテーブルの外観を知っているなら、SELECT t1.a、t1.b、t2.a FROM t1 INNER JOIN t2 ON(...) 'を実行し、その結果を連想的なもの。その後、適切なオブジェクトにデータの各ビットを格納することができます。 – halfer

+0

ありがとう、本当に助けてくれました。私は何とかテーブルの構造を知る必要があると思っていませんでした。その欠陥を回避しようとしました。あなたがそれを言及した後に、抽選盤に戻った。 – wacki

0

mysqli_result::fetch_fieldsは便利なものがあります。

http://www.php.net/manual/en/mysqli-result.fetch-fields.php

  • テーブル
  • orgtable
  • フィールドタイプ
  • など
+0

はい、OPがテーブル構造を記録しない場合、彼はこのようなことをしなければならないかもしれません。もちろん、それは何らかの方法でキャッシュすることができますが、遅くなります。 – halfer

+0

はい、これは動作します、私はすでにfetch_fieldsを使って試しましたが、パフォーマンスは満足できません。だから私はORMがhalferのようなテーブル構造を知っているようにしました。これにより、同じ名前の複数の列を選択できる列に別名を割り当てることもできます。 – wacki

関連する問題