2017-09-08 68 views
5

यह प्रश्न पहले से ही here से पूछा गया था लेकिन इसे कोई जवाब नहीं मिला। अब मुझे एक ही समस्या का सामना करना पड़ रहा है लेकिन लार्वेल 5.4 में। मेरे पास एक मॉडल Book है, एक मॉडल ReadingSession और एक मॉडल Comment है। एक पुस्तक में कई पढ़ने के सत्र हैं और इसमें कई टिप्पणियां हैं लेकिन रीडिंग सत्र में टिप्पणियां भी हो सकती हैं। तो मैं अपने संबंधों को इस तरह परिभाषित किया है:एक बच्चे मॉडल में एक बहुलक संबंध का उपयोग अनंत अनंत पाश का कारण बनता है?

Book.php

protected $with = [ 
    'author', 
    'readingSessions', 
    'userRating', 
    'ratings', 
    'comments' 
]; 

public function users() 
{ 
    return $this->belongsToMany(User::class, 'user_book'); 
} 

public function author() 
{ 
    return $this->belongsTo(Author::class); 
} 

public function allReadingSessions() 
{ 
    return $this->hasMany(ReadingSession::class); 
} 

public function readingSessions() 
{ 
    return $this->hasMany(ReadingSession::class) 
       ->where('user_id', Auth::user()->id); 
} 

public function ratings() 
{ 
    return $this->hasMany(Rating::class); 
} 

public function userRating() 
{ 
    return $this->hasMany(Rating::class) 
       ->where('user_id', Auth::user()->id); 
} 

public function comments() 
{ 
    return $this->morphMany('App\Models\Comment', 'commentable'); 
} 

ReadingSession.php

protected $with = ['comments']; 

public function user() 
{ 
    return $this->belongsTo(User::class); 
} 

public function book() 
{ 
    return $this->belongsTo(Book::class); 
} 

public function comments() 
{ 
    return $this->morphMany('App\Models\Comment', 'commentable'); 
} 

Comment.php

public function commentable() 
{ 
    return $this->morphTo(); 
} 

ये अनंत लूप बनाने के लिए लगता है । क्या कोई मुझे गलत काम कर रहा है पर संकेत दे सकता है?

उत्तर

3

मुख्य कारण यह है कि आपके पास अनंत लूप हो सकता है, यदि आप स्वचालित रूप से एक रिश्ते को लोड करने का प्रयास कर रहे हैं जो बदले में पिछले मॉडल के साथ ऐसा करने का प्रयास करता है।

एक उदाहरण में लाना:

Book.php

protected $with = [ 
    'author', 
]; 

public function author() 
{ 
    return $this->belongsTo(Author::class); 
} 

author.php

protected $with = [ 
    'books', 
]; 

public function books() 
{ 
    return $this->hasMany(Book::class); 
} 

इस मामले में, हर बार जब आप एक लेखक लाने यह स्वचालित रूप से अपनी पुस्तकों में लायेगा जो बदले में लेखक को और आगे लाने की कोशिश करेगा ...

एक और बात ऐसा हो सकता है और कुछ एक्सेसर्स पर $appends संपत्ति का उपयोग करते समय यह महसूस करना कठिन होता है। यदि आप स्वचालित रूप से $appends के माध्यम से एक मॉडल में एक चर के रूप में प्रयास कर रहे हैं और यदि वह एक्सेसर किसी रिश्ते को प्राप्त करता है या किसी तरीके से संबंध का उपयोग करता है तो आपको फिर से अनंत लूप मिल सकता है।

उदाहरण: author.php

protected $appends = [ 
    'AllBooks', 
]; 

public function books() 
{ 
    return $this->hasMany(Book::class); 
} 

public function getAllBooksAttribute() { 
    return $this->books->something... 
} 

इस मामले में, हर बार एप्लिकेशन की कोशिश करता है अपने लेखक मॉडल को हल करने में यह किताबें लायेगा, कि बारी में लायेगा लेखक, कि बारी में लायेगा किताबें फिर से और चालू ...

अपने स्निपेट से, यह स्पष्ट नहीं है कि समस्या का कारण क्या है लेकिन यह उत्तर कुछ लीडों को कहां खोज सकता है।

इसे हल करने के लिए आपको $with से संबंध को हटा दें और इसे मैन्युअल रूप से लोड हो सकती हैं: $author->load('books') या तुम भी उदाहरण के लिए, इस तरह से एक रिश्ता के संबंध लोड कर सकते हैं: $author->load('books', 'books.comments') या Author::with('books', 'books.comments')->where...

यह सब जो आप प्राप्त करने की कोशिश कर रहे हैं वह नीचे आता है। तो आपको मूल्यांकन करना होगा कि आपको क्या लोड करना चाहिए और आपको ऑटो लोड क्यों नहीं करना चाहिए।

अपने मॉडलों पर स्वचालित संबंधों को लोड करते समय सावधान रहें और $appends पर एक्सेसर्स जोड़ने पर सावधान रहें, खासकर यदि वे संबंधों का उपयोग करते हैं। यह एक शानदार विशेषता है लेकिन कभी-कभी कड़ी मेहनत कर सकती है।

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