2010-05-19 16 views
8

मैं एक फ़ाइलें मॉडल है में एक ही आईडी क्षेत्र को संदर्भित, और एकाधिक (वर्तमान में 3) विभिन्न अन्य मॉडल (अनुच्छेद, नौकरी, इवेंट) सभी फाइलों को हो सकता है, कि फ़ाइलें मॉडल में संग्रहीत हैं।सिद्धांत - एकाधिक मॉडल एक और मॉडल

समस्या यह है कि जब मैं (./doctrine निर्माण सभी पुनः लोड) CLI-टूल के माध्यम से टेबल उत्पन्न करते हैं, मैं इस त्रुटि संदेश मिलता है:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot 
add or update a child row: a foreign key constraint fails 
(`my_database/articles`, CONSTRAINT `articles_id_files_target_id` 
FOREIGN KEY (`id`) REFERENCES `files` (`target_id`)) 

फ़ाइल (के रूप में परिभाषित किया गया है कोई संबंध नहीं है

columns: 
    id: 
    primary: true 
    autoincrement: true 
    type: integer(4) 
    target_id: integer(4) 
    filename: string(255) 
[...] 

सभी 4 मॉडल इस संबंध परिभाषा है:: इस मॉडल में परिभाषित) में परिभाषित

relations: 
    Files: 
     type: many 
     class: File 
     local: id 
     foreign: target_id 

टी

public function setUp() 
{ 
    parent::setUp(); 
    $this->hasOne('Publication', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 

    $this->hasOne('Event', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 

    $this->hasOne('Article', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 

    $this->hasOne('Job', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 
} 

मैं क्यों ऐसा होता है (प्रतिबन्ध कई तालिकाओं के लिए सेटअप नहीं किया जा सकता है), लेकिन मैं यह कैसे हल कर सकते थे पता नहीं है: अपने Php-संहिता है कि सिद्धांत उत्पन्न करता है (BaseFile.php) है mutltiple फ़ाइल टेबल या एक एसोसिएशन टेबल के बिना समस्या।

क्या डॉक्टर को यह बताने का कोई तरीका है कि इसे फ़ाइल मॉडल में संबंध नहीं बनाना चाहिए?

कोई अच्छा विचार?

+0

क्या मैं पूछ सकता हूं कि आप इसे एसोसिएशन टेबल का उपयोग क्यों नहीं करते हैं? यह एक बहुत ही लचीला और कुशल समाधान है क्योंकि यह आपको एक ही फ़ाइल को कई बार अपलोड किए बिना अलग-अलग सामग्री प्रकारों से लिंक करने की अनुमति देगा। आपके वर्तमान मॉडल के साथ यह असंभव है ... – wimvds

+0

क्या मैं वास्तव में इसे एक एसोसिएशन टेबल के साथ हल कर सकता हूं? मैं "प्रकार" फ़ील्ड के बारे में सिद्धांत कैसे बताऊंगा? – smoove

+0

मुझे नहीं पता कि यह सिद्धांत के साथ कैसे हो सकता है, लेकिन समस्या शायद एक तालिका को जोड़कर सिद्धांत के साथ निहित है जो ** किसी अन्य तालिका पर निर्भर है ** ** इससे पहले कि अन्य तालिका बनाई गई हो। –

उत्तर

0

कोशिश करता है, तो आप की जरूरत है,
संबंधों:

columns: 
    id: { type: integer(4), notnull: true, primary: true, autoincrement: true } 
    target_id: { type: integer(4), notnull: true } 
    model:  { type: string, notnull: true } 

फ़ाइलें मॉडल आईडी और लिंक की गई प्रविष्टि के मॉडल के लिए ज़रूरी है:

Files: 
    type: many 
    class: File 
    local: target_id 
    foreign: id 
Files2: 
    type: many 
    class: File 
    local: id 
    foreign: id 
0

आप की तरह कुछ कोशिश कर सकते हैं। तो, Files.class.php में आप यह भी निर्दिष्ट कर सकते हैं:

public function getArticles() { 
    if (strcmp($this->getModel(), 'Articles')) { 
     return Doctrine::getTable('Articles')->findOneById($this->getTargetId()); 
    } else { 
     return false; 
    } 
} 

शायद वहाँ एक बेहतर तरीका है, लेकिन इस मामले में आप है 1 टेबल, आप किसी भी अधिक संबंधों की जरूरत नहीं है, लेकिन आप ही टिककर खेल में बताने की/खुद से सेटर्स। तो यह आपके लक्ष्यों पर निर्भर करता है कि यह फ़िर होगा या नहीं।

संबंधित मुद्दे