यदि हमारी स्थिति मानक दृश्य है जहां आपके पास दो टेबल और एक टर्नरी है, और निम्नलिखित दस्तावेज़

लेकिन अगर हमारे पास दो टेबल के बजाय तीन हैं और फिर टर्नरी में 3 प्राइमरीकी होते हैं, जैसा कि मैं अपनी वाईएमएल फाइलें लिखता हूं?

स्थिति का उदाहरण:

मामला लें कि मेरे पास एक उपयोगकर्ता है जो पाठ्यक्रम में भाग लेता है। तो मेरे पास एक users टेबल, courses टेबल और एक users_has_courses (useri_id, course_id) है। यह कई-से-अनेक का मानक मामला है। लेकिन मेरे पास एक टेबल invoices और इसलिए एक टेबल users_courses_invoices है जहां तीन प्राइमेकी (user_id, course_id, चालान_आईडी) हैं।

1
JellyBelly 2 नवम्बर 2011, 20:44
@ManseUK: मैं स्थिति में उदाहरण जोड़ता हूं!
 – 
JellyBelly
3 नवम्बर 2011, 12:44

1 उत्तर

सबसे बढ़िया उत्तर

आपकी स्थिति में आपके पास User और Course मॉडल हैं और वे कई से कई संबंधों से जुड़े हुए हैं जिनमें जोड़ी (user_id, course_id) कुंजी के रूप में है। मैं इस मॉडल सदस्यता को कॉल करूंगा, और इसे इसका अपना पहचानकर्ता दूंगा, और फिर मैं इस मॉडल को Invoice मॉडल से जोड़ूंगा, इसलिए आपकी अंतिम योजना (न्यूनतम संस्करण) हो सकती है:

User:
  columns:
    id:
      type: integer
      primary: true

Course:
  columns:
    id:
      type: integer
      primary: true

Subscription:
  columns:
    id:
      type: integer
      primary: true
    user_id:
      type: integer
      notnull: true
    course_id:
      type: integer
      notnull: true
  relations:
    User:
      foreignAlias: Subscriptions
    Course:
      foreignAlias: Subscriptions

Invoice:
  columns:
    id:
      type: integer
      primary: true
    subscription_id:
      type: integer
      notnull: true
  relations:
    Subscription:
      foreignAlias: Subscription
      foreignType: One

इस तरह आपके पास एक सामान्यीकृत डेटाबेस है और आप इस कोड के साथ उपयोगकर्ताओं और पाठ्यक्रमों दोनों से चालान तक पहुंच सकते हैं:

$user->Subscriptions->getFirst()->Invoice
$course->Subscriptions->getFirst()->Invoice

यदि आप किसी दिए गए उपयोगकर्ता के लिए सभी चालान चाहते हैं तो आप इस तरह से एक प्रश्न कर सकते हैं

InvoiceTable::getInstance()->createQuery('i')
    ->select('i.*')
    ->leftJoin('i.Subscription s')->leftJoin('s.User u')
    ->where('u.id = ?', $user_id);

यदि आप किसी दिए गए पाठ्यक्रम के लिए सभी चालान चाहते हैं तो वही लागू होता है।

1
Fabio 4 नवम्बर 2011, 15:23
ठीक! आपकी वाणी से पलक नहीं झपकती! लेकिन वर्तमान में मेरे पास टेबल Subscription user_id और course_id प्राइमरीकी के रूप में है। मेरे पास id फ़ील्ड नहीं है! :एस
 – 
JellyBelly
4 नवम्बर 2011, 15:35
आप इसे जोड़ने के लिए हमेशा एक माइग्रेशन लिख सकते हैं (जो IMHO सबसे अच्छा समाधान है) ... वैकल्पिक रूप से मुझे याद नहीं है कि क्या आप local: [user_id, course_id] foreign: [user_id, course_id] के लिए सिद्धांत में एक जोड़ी को विदेशी कुंजी के रूप में इंगित कर सकते हैं Subscription संबंध Invoice मॉडल में। या आप Invoice और Subscription मॉडल में कुछ कस्टम तरीके जोड़ सकते हैं जो संबंधित रिकॉर्ड लाने के लिए सही क्वेरी करते हैं।
 – 
Fabio
4 नवम्बर 2011, 15:42
कारण मुझे विश्वास है कि मैं अपने पैरों पर वापस जाता हूं। मैं आईडी जोड़ने के लिए टेबल पर एक परिवर्तन तालिका बनाता हूं, अन्यथा मुझे नहीं पता कि कैसे बाहर निकलना है। धन्यवाद
 – 
JellyBelly
4 नवम्बर 2011, 15:54