2014-10-03 4 views
6

पृष्ठभूमि के बिना किसी अन्य Laravel/सुवक्ता मॉडल के लिए एक hasOne मॉडल अटैच किया जा रहा

को देखते हुए हम निम्न दो तालिकाओं type_id questionType में एक पंक्ति का संदर्भ जहां है:को निर्दिष्ट आईडी

सवाल

id | type_id | description 
---+---------+------------ 
1 | 1  | A nice question 
.. | ..  | .. 

प्रश्न टाइप

id | name 
---+---------------- 
1 | Multiple-choice 
.. | .. 
निम्नलिखित सुवक्ता मॉडलों के साथ

:

class Question extends Model { 
    public function type() { 
     return $this->hasOne('QuestionType', 'id', 'type_id'); 
    } 
} 

class QuestionType extends Model { 
} 

प्रश्न 1

मैं एक नए सवाल एक मौजूदा प्रश्न प्रकार संदर्भ के बिना मैन्युअल आईडी के साथ कुछ भी करने से जोड़ सकते हैं? उदाहरण के लिए निम्नलिखित काम करता है लेकिन जब से मैं मैन्युअल रूप से इसी सवाल प्रकार आईडी असाइन करने के लिए है imo बदसूरत है:

$q = new Question; 
$q->type_id = 1; // Multiple-choice 
$q->description = 'This is a multiple-choice question'; 
$q->save(); 

एक लगता होगा ORM आईडी-असाइनमेंट संभाल (जाने के लिए एक रास्ता था बिंदु नहीं है ORMs के साथ इस तरह सामान से बचने के लिए), की तर्ज पर कुछ (इस सुवक्ता ORM में काम नहीं करता):

$q = new Question; 
$q->type = QuestionType.where('name', '=', 'Multiple-choice'); 
$q->description = 'This is a multiple-choice question'; 
$q->save(); 

प्रश्न 2

1 सवाल के संबंध में, मैं कैसे जाना होगा एक नया क्यू जोड़ने के बारे में uestion जो नया प्रश्न प्रकार का संदर्भ देता है बिना मैन्युअल रूप से कुछ भी कर रहा है?

$t = new QuestionType; 
$t->name = 'Another type'; 

$q = new Question; 
$q->type = $t; 
$q->description = 'This is a multiple-choice question'; 
$q->save(); 

यहाँ मैं $q->save() दोनों नए सवाल प्रकार और सवाल (या कुछ इसी तरह) को बचाने के लिए करना चाहते हैं: इसी तरह मैं की तर्ज पर कुछ कल्पना।

$t = new QuestionType; 
$t->name = 'Another type'; 
$t->save(); 

$q = new Question; 
$q->type = $t->id; 
$q->description = 'This is a multiple-choice question'; 
$q->save(); 

मैं भाग्य के बिना save(), update() तरीकों के विभिन्न संयोजनों के साथ खेल की कोशिश की है:

निम्नलिखित काम करता है, लेकिन फिर मैं आईडी अपने आप को जो मेरा मानना ​​है कि ORM संभाल चाहिए बताए रहा हूँ। मैंने attach() को भी देखा जो hasMany संबंधों पर मौजूद है लेकिन hasOne में अनुपलब्ध प्रतीत होता है।

+0

'' attach' belongsToMany' (अनेक-से-अनेक धुरी के साथ) विधि है, इसलिए इसे 'hasMany' संबंध पर काम नहीं करेगा। 'हैन'/'हैनी '' save' विधि प्रदान करता है, जो काफी तार्किक है, क्योंकि जब आप अपना क्षेत्र बदलते हैं तो आपको मॉडल को सहेजना होगा (विदेशी कुंजी)। –

उत्तर

10

सबसे पहले, आप रिश्ता आप का उल्लेख गलत समझा।

// Question model 
public function questionType() 
{ 
    return $this->belongsTo('QuestionType', 'type_id'); 
} 

// QuestionType model 
public function questions() 
{ 
    return $this->hasMany('Question', 'type_id'); 
} 

तो आप इस तरह एक साथ उन्हें लिंक कर सकते हैं:

$questionType = QuestionType::where(..)->first(); 

$question = new Question; 
... // do something with it 

// associate 
$question->questionType()->associate($questionType); 

// or the other way around - save new question and link to the type: 
$questionType->questions()->save($question); 

आप स्पष्ट रूप से के रूप में अच्छी तरह से संबद्ध करने के लिए एक आईडी पारित कर सकते हैं:

$question->type_id = $someTypeId; 
$question->save(); 

यहाँ आप क्या जरूरत है

आप यह नहीं कर सकते:

$question->questionType = $someQuestionType; 

इस तरह से वार्तालाप मॉडल विशेषताओं को संभालता है, संबंध नहीं।


प्रश्न 2:

$questionType = new QuestionType(['name' => 'multiple']); 
$questionType->save(); 

$question = new Question([ ... some values ... ]); 

// then either this way: 
$questionType->questions()->save($question); 

// or, again, the other way around: 
$question->questionType()->associate($questionType); 
$question->save(); 
+0

धन्यवाद जेरेक! ऐसा लगता है कि मैंने 'हैऑन 'और' संबंधित 'के अर्थशास्त्र को मिश्रित किया था। मेरे दिमाग में '$ यह-> हैऑन (' प्रश्न टाइप ')' जहां '$ यह' प्रश्न' है इसका अर्थ है कि _Question_ में _QuestionType_ है। आखिरकार जब आप इसे सही तरीके से वास्तविक मानते हैं तो इसका क्या अर्थ है? लेकिन जाहिर है यह चारों ओर एक और तरीका है - उलझन में! – olerass

+0

@olerass यह शुरुआत में भ्रामक हो सकता है। लेकिन इसके बारे में सोचें - क्या वास्तव में एक प्रश्न का एक प्रकार है? नहीं, यह एक प्रकार से संबंधित है और यही वही है जो इल्यूक्वेंट का तात्पर्य है। –

+0

मुझे पता है कि यह एक पुराना धागा है, लेकिन मेरे पास एक समाधान है जहां आप सीधे प्रश्न प्रकार को '$ question-> question टाइप = $ someQuestionType;' के साथ सेट कर सकते हैं। कोड: [पास्टबिन] (https://pastebin.com/BLX7TzUf) –

0

मेरे लिए प्रश्न 1 का उत्तर देना दोनों विधियां अच्छी हैं, आपको कुछ भी बदलने की आवश्यकता नहीं है।

प्रश्न का उत्तर 2 आपको दिखाए जाने के अनुसार इसे करना चाहिए। जब तक आप मैन्युअल रूप से save विधि का उपयोग नहीं करते हैं, तब तक ORM स्वचालित रूप से QuestionType नहीं बनाएगा।

$t = new QuestionType; 
$t->name = 'Another type'; 

$t2 = new QuestionType; 
$t2->name = 'Another type 2'; 

$q = new Question; 
$q->type = $t; // what here - $t2 or $t ? 
$q->description = 'This is a multiple-choice question'; 
$q->save(); 

क्या ORM तय करना चाहिए:

उदाहरण के लिए यदि आप कोड का इस्तेमाल किया? प्रश्न किसी भी $t या $t2 से कनेक्ट नहीं है, इसलिए ओआरएम आपके लिए यह तय नहीं करेगा।आपको ओआरएम को बताने की ज़रूरत है कि किस प्रकार का है।

मैं ओआरएम/वाद्य विशेषज्ञ नहीं हूं लेकिन मुझे लगता है कि आप ओआरएम से बहुत अधिक उम्मीद करते हैं। ओआरएम को अनुमान नहीं लगाया जाना चाहिए कि आप क्या करना चाहते हैं। यह आपको संबंधों या वस्तुओं का प्रबंधन करने में मदद करता है लेकिन यदि आप ऐसा करने के लिए नहीं कहते हैं तो यह ऑब्जेक्ट्स को संबद्ध नहीं करेगा।

हालांकि आप उत्परिवर्ती के साथ प्रयास कर सकते हैं। आप अपने प्रश्न मॉडल के लिए जोड़ सकते हैं:

public function setTypeAttribute($value) 
{ 
    $value->save(); 
    $this->attributes['type_id'] = $value->id 
} 

और अब यह $q->type = $t; उपयोग करने के लिए संभव हो जाना चाहिए (हालांकि मैं यह परीक्षण नहीं किया)

+0

प्रश्न 1 के संबंध में: दूसरी विधि छद्म कोड है, यह लार्वेल (एलोक्वेंट ओआरएम) में काम नहीं करती है। या कम से कम, मुझे नहीं पता कि यह कैसे करना है। क्या आप? प्रश्न 2 के संबंध में: आप प्रश्न $ टी से $ $ q-> टाइप = $ टी' पर जोड़ रहे हैं, इसलिए मुझे यकीन नहीं है कि मैं ओआरएम को क्या निर्णय लेना चाहिए इसके बारे में आपकी चिंता को समझता हूं। बेशक इसे '$ q-> save()' पर $ t और $ q बचाया जाना चाहिए, और यदि आप $ t2 को किसी भी चीज़ से कनेक्ट नहीं करते हैं या इसे मैन्युअल रूप से सहेजते हैं तो यह सहेजा नहीं जाता है। – olerass

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