2011-08-04 13 views
5

के माध्यम से मॉडल को ढूंढने में मैं Yii उपयोग कर रहा हूँ और 3 टेबल है: उपयोगकर्ताओं को एक users_devices तालिका (user_id, DEVICE_ID) के साथ उपकरणों उन दोनों के बीच MANY_MANY संबंधों को परिभाषित करने के लिए।Yii many_many संबंध

क्या मैं के लिए देख रहा हूँ अपने आईडी (devices.id) से एक डिवाइस को खोजने का सरलतम विधि है कि एक विशिष्ट उपयोगकर्ता (users.id) ActiveRecord के माध्यम से से संबंधित है।

परिदृश्य एक REST API का एक डिवाइस के लिए क्वेरी है, लेकिन मैं इस उपकरण सुरक्षा कारणों के लिए प्रयोक्ता की है सत्यापित करना चाहते हैं।

$device = Devices::model()->findByPk($deviceId)->having(
    array('user_id' => $userId)); 

अग्रिम धन्यवाद किसी भी मदद के लिए, मैं थोड़ी देर के लिए यह शोध किया गया है और एक सुरुचिपूर्ण समाधान नहीं मिल सकता है:

कुछ इस तरह विचार है।

+0

क्या उपयोगकर्ताओं_devices में user_id और device_id प्राथमिक (समग्र) कुंजी के रूप में है? ऐसा है, prmaryKey() को ओवरराइड करना न भूलें (जैसे] (http://learnyii.blogspot.com/2010/12/yii-on-many-many-relationships.html)। और आप उपयोगकर्ता-डिवाइस संबंध (या एक की कमी) की पहचान करने के लिए अपने कस्टम-निर्मित मॉडल का उपयोग करके उस तालिका पर केवल एक खोज कर सकते हैं। – hobs

+0

आपका मतलब MANY_MANY नहीं है HAS_MANY। – hobs

+0

@ हॉब्स, आप सही हैं। –

उत्तर

7

, Yii मंचों पर कुछ मदद मिल गया जो मुझे अपने आप को यह पता लगाने के लिए प्रेरित किया:

$device = Device::model()->with('users')->find(array(
    'condition' => 'user_id = :userId AND device_id=:deviceId', 
    'params' => array(':userId' => Yii::app()->user->id, ':deviceId' => $_GET['id']))); 
1

क्या आपको एआर का उपयोग करना है?

मैं हमेशा जब जटिल बयान के साथ काम कर query builder का उपयोग करना पसंद ...

यानी

$user = Yii::app()->db->createCommand() 
    ->select('id, username, profile') 
    ->from('tbl_user u') 
    ->join('tbl_profile p', 'u.id=p.user_id') 
    ->where('id=:id', array(':id'=>$id)) 
    ->queryRow(); 
+0

मुझे लगता है कि मुझे वाईआई के मानदंड का उपयोग करते हुए जटिल क्वेरी से निपटने के दौरान क्वेरी बिल्डर, अंतहीन डीबग का उपयोग करना होगा। धन्यवाद –

2

दो लो।

Device.php में

:

$device = Device::model()->findByPk($deviceId); 
if ($device->users->findByPk($userId) == Null) 
    $device = Null; 

यह इस तरह लगता है काम करेगा लेकिन अकुशलता से अनावश्यक का एक बहुत पुनः प्राप्त: अनुरोध डिवाइस का अनुरोध उपयोगकर्ता के स्वामित्व में है अगर

// creates a users property within a Device, a container of associated Users 
public function relations() 
    { 
     return array(
      'users'=>array(self::MANY_MANY, 'User', // don't use HAS_MANY 
       'user_devices(user_id, device_id)'), // composite key assumed 
     ); 
    } 
तो

को खोजने के लिए उपयोगकर्ता रिकॉर्ड, क्योंकि आप पहले से ही जानते हैं कि उपयोगकर्ता कौन है और संभवतः पहले से ही उनके सक्रिय रिकॉर्ड हैं। इस innefficiency बचने के लिए, Yii चंचल विकास पुस्तक माता पिता मॉडल के भीतर M2M संबंध प्रश्नों के लिए कच्चे एसक्यूएल का उपयोग करता है (Device.php):

// "Agile" uses a $user AR argument, you can use $userId instead 
public function doesUserOwnDevice($userId) 
{ 
    $sql = "SELECT user_id FROM user_devices WHERE 
    device_id=:deviceId AND user_id=:userId"; 
    $command = Yii::app()->db->createCommand($sql); 
    $command->bindValue(":deviceId", $this->id, PDO::PARAM_INT); 
    $command->bindValue(":userId", $userId, PDO::PARAM_INT); 
    return $command->execute()==1 ? true : false; 
} 

मैं Device बजाय Devices इस्तेमाल किया मॉडल (वैसे ही device के लिए के नाम के लिए तालिका का नाम)। यदि आप कट और पेस्ट करते हैं तो रिफैक्टर। इसी प्रकार User के लिए। इसी प्रकार "tbl_" उपसर्ग गायब होने के लिए।