2011-01-30 7 views
2

私は以下の表を持っていた:Yii Frameworkに「has_one:through(from Rails)」のようなものがありますか?

manufacturers 
* id 
* name 
* description 

types 
* id 
* name 
* description 
* manufacturer_id 

cars 
* id 
* title 
* description 
* type_id 

今私の問題は、私は例えばタイプとmanufacurers、と車一覧表示したい場合は、次のとおりです。

* Some Car, Fiat Punto 
* Another Car, Ferrari F1 

を...

をレールに私はsthとメーカーの関係を設定することができます。

class Car < ActiveRecord::Base 
    belongs_to :type 
    has_one :manufacturer, :through => :type 
end 

これはYiiでも可能ですか?

答えて

2

このようなことを達成するには、リレーションシップ関数を使用する必要があります。導入される最良のページは、hereというActiveRecordに関するものです。

カーの関係は1対多であるため、タイプは「HAS_MANY」になります。

例えば

(あなたが車やメーカーのモデルを持っていると仮定します):

車:

public function relations() 
{ 
    return array('manufacturer' => array(self::BELONGS_TO, 'Manufacturer', 'manufacturerId')); 
} 

メーカー:あなたは、その後、車の配列を取得することができ

public function relations() 
{ 
    return array('cars' => array(self::HAS_MANY, 'Car', 'manufacturerId')); 
} 

メーカー:

foreach($oManufacturer->cars as $oManufacturer) 
    echo $oManufacturer->name; 
車の場合

echo $oCar->manufacturer->name; 

これは、両方のテーブルがmanufacturerIdがfiedが持っていることを前提としています。 希望するもの:

編集:両方のモデルでリレーションを定義する義務はありません。たとえば、車からメーカーを必要としない場合は、関係関数を定義しないことが大丈夫です。

+0

ありがとうございました。それは私の現在の解決策です(型と車にmanufacturer_idを挿入する)。しかし、carsテーブルにmanufacturer_idを付けずにリレーションシップを作成することは可能ですか? – ipsum

+0

私が見ることができる唯一の他の解決策は、carId <> manufacturerIdエントリを保持するマッピングテーブルを作成することです。 findByAttributesを実行して、自動車または製造業者のいずれかを最初に見つけて、それらを実際のオブジェクトにリンクさせなければならない場合は、もう少し作業が必要です。 – Blizz

関連する問題