2016-04-04 11 views
-1

テーブルstaffには、フィールドidinitialsがあります。これらの両方のはstaff表にinitialsを指している必要があります -Yii2でこの関係を設定する方法

関連テーブルsalesはフィールドseller、およびlisterを持っています。

販売テーブルには、リスターだったスタッフに売り手だった別のスタッフがいます。これは実装しようとしている関係です。

私はこの種のものをドキュメントで見つけることができるとは確信していません。 Salesモデルで

は、私が持っている方法をルール:しかし

[['lister'], 'exist', 'skipOnError' => true, 'targetClass' => Staff::className(), 'targetAttribute' => ['lister' => 'id']], 
[['seller'], 'exist', 'skipOnError' => true, 'targetClass' => Staff::className(), 'targetAttribute' => ['seller' => 'id']], 

、私は、私が取得していますstaff.initials経由GridViewの関係を表示しようとすると、例外

Getting unknown property: app\models\Sale::staff 
私は「

私は関係をどこか正しく表現していないのでしょうか、あるいは私のdbデザインに欠陥がありますか?

+0

は私たちに、私が持っているどのようなあなたの販売のクラス – soju

+0

の対応関係を表示する販売モデルでは上記です。私が紛失しているものがありますか? – yoyoma

答えて

1

まず、データモデルに欠陥があるようです。私がこれを言う唯一の理由は、あなたのコードにどのような修正を加える必要があるかもしれないからです。

ここで問題となるのは、複数のスタッフが同じイニシャルセットを持っている場合があります。その場合は、お客様のsalesテーブルの参照先がわかりません。私はあなたが我々が上記に同意できる場合は、あなたのSalesモデルで関係が欠落しているように、それが聞こえる

(代わりにinitialsの)sellerlister分野でstaff.idを維持示唆しています。 official documentationを確認してください。

あなたのSalesモデルに以下のメソッドを追加する必要があります。

public function getSeller() 
{ 
    return $this->hasOne(Staff::className(), ['id' => 'seller']); 
} 

public function getLister() 
{ 
    return $this->hasOne(Staff::className(), ['id' => 'lister']); 
} 

これが完了すると、あなたが経由でこれらにアクセスできるようになります:GridViewのでは

$sale = Sales::find()->one(); 
$sale->lister; // will return a Staff object. 
$sale->seller; // will return a Staff object. 

あなたをseller.initialsおよび/またはlister.initialsのイニシャルを表示できる必要があります。

それがあなたに役立つかどうか教えてください。

乾杯

+0

ありがとうございましたが、今はエラーが表示されません。グリッドビューに「(設定されていません)」と表示されますか? – yoyoma

+0

はDBの頭文字ですか?グリッドビューの呼び出しを要点に表示できますか? –

+0

https://gist.github.com/anonymous/81d03996903a73c6f0168bf65d07ff84 – yoyoma

関連する問題