संक्षेप में :ActiveRecord
. का उपयोग करना आपके द्वारा सुझाए गए जंक्शन तालिका के लिए IMHO सही तरीका है क्योंकि आप via()
सेट कर सकते हैं उस मौजूदा ActiveRecord
. का उपयोग करने के लिए . यह आपको Yii के link()
. का उपयोग करने की अनुमति देता है एक ही समय में डेटा (जैसे आपका व्यवस्थापक ध्वज) जोड़ते समय जंक्शन तालिका में आइटम बनाने की विधि।
आधिकारिक Yii गाइड 2.0 जंक्शन तालिका का उपयोग करने के दो तरीके बताता है:viaTable()
. का उपयोग करना और via()
. का उपयोग करना (देखें यहां
) जबकि पूर्व पैरामीटर के रूप में जंक्शन तालिका के नाम की अपेक्षा करता है, बाद वाला पैरामीटर के रूप में संबंध नाम की अपेक्षा करता है।
यदि आपको जंक्शन तालिका के अंदर डेटा तक पहुंच की आवश्यकता है तो मैं ActiveRecord
. का उपयोग करूंगा जंक्शन तालिका के लिए जैसा आपने सुझाव दिया है और via()
. का उपयोग करें :
class User extends ActiveRecord
{
public function getUserGroups() {
// one-to-many
return $this->hasMany(UserGroup::className(), ['user_id' => 'id']);
}
}
class Group extends ActiveRecord
{
public function getUserGroups() {
// one-to-many
return $this->hasMany(UserGroup::className(), ['group_id' => 'id']);
}
public function getUsers()
{
// many-to-many: uses userGroups relation above which uses an ActiveRecord class
return $this->hasMany(User::className(), ['id' => 'user_id'])
->via('userGroups');
}
}
class UserGroup extends ActiveRecord
{
public function getUser() {
// one-to-one
return $this->hasOne(User::className(), ['id' => 'user_id']);
}
public function getGroup() {
// one-to-one
return $this->hasOne(Group::className(), ['id' => 'userh_id']);
}
}
इस तरह आप userGroups
का उपयोग करके अतिरिक्त प्रश्नों के बिना जंक्शन तालिका का डेटा प्राप्त कर सकते हैं संबंध (किसी भी अन्य एक-से-अनेक संबंध की तरह):
$group = Group::find()->where(['id' => $id])->with('userGroups.user')->one();
// --> 3 queries: find group, find user_group, find user
// $group->userGroups contains data of the junction table, for example:
$isAdmin = $group->userGroups[0]->adminFlag
// and the user is also fetched:
$userName = $group->userGroups[0]->user->name
यह सब hasMany
. का उपयोग करके किया जा सकता है संबंध। तो आप पूछ सकते हैं कि आपको via()
. का उपयोग करके कई-से-अनेक संबंधों की घोषणा क्यों करनी चाहिए? :क्योंकि आप Yii के link()
. का उपयोग कर सकते हैं जंक्शन तालिका में आइटम बनाने की विधि:
$userGroup = new UserGroup();
// load data from form into $userGroup and validate
if ($userGroup->load(Yii::$app->request->post()) && $userGroup->validate()) {
// all data in $userGroup is valid
// --> create item in junction table incl. additional data
$group->link('users', $user, $userGroup->getDirtyAttributes())
}