-1

しばらくコハナを使っています。問題なく「has_many」、「has_one」、「belongs_to」を使用しています。私の質問は次のとおりです。

次のような 2 つのテーブルがある場合:

tbl_foo1

id | tbl_foo2_id | field1
-------------------------
1  | 2           | bar
2  | 1           | foo

tbl_foo2

id | field1
-----------
1  | foo
2  | bar

tbl_foo1 は tbl_foo2 に属し、tbl_foo2 には多くの tbl_foo1 があります。これまでのところ、うまくいっています。

問題は、コントローラーに関係を保存しようとするときです..だから私はこのコードを持っています:

$t1 = ORM::factory('tbl_foo1')->values($values, $expected)->create();
$t2 = ORM::factory('tbl_foo2', $_POST['id']);
$t1->tbl_foo2_id = $t2;
$t1->save();

わかりました、これはうまくいくはずですが、これは最善の解決策でも最も美しい解決策でもないと思います。2 つの理由から、1 つはパフォーマンスのため - 3 つのクエリ (1 つは $t1 を保存するため、2 つは $t2 を見つけるため、3 つは $t2 と $t1 の関係を保存するため) を実行し、2 つは空のレコードを保存する可能性があるためです。 t $t2 内のレコードの存在を検証します。

私の主な質問は、これをどのように行うべきかということです。


私自身の解決策

ビアカヴェロンがくれた解決策を使いました、ありがとう。それでも、検証の問題がありました..そのため、同じ例を使用して、時間をかけて解決策を考え出しました。

$t2 = ORM::factory('tbl_foo2', $_POST['id']);
$t1 = ORM::factory('tbl_foo1')->values($values, $expected);
$t1->foo2 = $t2; // foo2 is a belongs_to relationship
$t1->create();

tbl_foo1モデルに rules 関数を追加しました:

public function rules()
{
    'foo2_id' => array('not_empty')
}

したがって、この方法では別のクエリを実行する必要がありません。これはパフォーマンスに優れており、簡単な方法です。ORM がモデルの id を見つけようとするときに、tbl_foo2それが見つからない場合は NULL を返すため、それは機能します。そのため、何があっても常に空になります!

注: DB トランザクションも使用したため (これはプロセスの一部にすぎないため)、クエリの 1 つが何らかの理由で中断した場合、クエリは実行されません。トランザクションをサポートする 1 つのデータベース エンジンを使用する必要があることを覚えておいてください (私の場合は InnoDB です)。

4

1 に答える 1

0

belongs_to1 モデルをオブジェクトとともに保存できます:

$t2 = ORM::factory('tbl_foo2', $this->request->post('id'));
if (!$t2->loaded()) 
{
    // wrong ID for tbl_foo2
}

$t1 = ORM::factory('tbl_foo1')->values($values, $expected);
$t1->foo2 = $t2; // foo2 is a belongs_to relationship
$t1->create();

2tbl_foo2_id特別なコールバックで確認します。

于 2012-07-19T19:04:07.870 に答える