2017-09-08 63 views
5

Câu hỏi này đã được hỏi here nhưng không nhận được câu trả lời. Bây giờ tôi phải đối mặt với cùng một vấn đề nhưng trong laravel 5.4. Tôi có một mô hình Book, một mô hình ReadingSession và một mô hình Comment. Một cuốn sách có nhiều buổi đọc và có nhiều ý kiến ​​nhưng phiên đọc cũng có thể có ý kiến. Vì vậy, tôi đã quan hệ của tôi được định nghĩa như thế này:Sử dụng quan hệ đa hình trong mô hình con gây ra vòng lặp vô hạn?

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(); 
} 

Những dường như để tạo ra một vòng lặp vô hạn . Bất cứ ai có thể gợi ý cho tôi về những gì tôi đang làm sai?

Trả lời

3

Lý do chính bạn có thể có vòng lặp vô hạn là nếu bạn đang cố tải tự động mối quan hệ mà lần lượt cố gắng làm tương tự với mô hình trước đó.

Đưa nó vào một ví dụ:

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); 
} 

Trong trường hợp này, mỗi khi bạn lấy một tác giả nó sẽ lấy tự động cuốn sách của ông do đó sẽ cố gắng tìm nạp tác giả và bật và mở ...

Một điều khác điều đó có thể xảy ra và khó nhận ra hơn là khi sử dụng thuộc tính $appends trên một số người truy cập. Nếu bạn đang cố gắng tự động có một biến thành một mô hình thông qua các $appends và nếu người truy cập đó lấy một mối quan hệ hoặc sử dụng một mối quan hệ trong một số cách bạn có thể nhận được một vòng lặp vô hạn một lần nữa.

Ví dụ: Author.php

protected $appends = [ 
    'AllBooks', 
]; 

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

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

Trong trường hợp này, mỗi khi ứng dụng cố gắng giải quyết mô hình Tác giả của bạn nó sẽ lấy những cuốn sách, mà lần lượt sẽ lấy Tác giả, mà lần lượt sẽ lấy những cuốn sách lặp đi lặp lại ...

Từ đoạn trích của bạn, không rõ nguyên nhân gây ra sự cố nhưng câu trả lời này có thể cung cấp cho một số khách hàng tiềm năng nơi tìm kiếm nó.

Để giải quyết nó, bạn có thể loại bỏ các mối quan hệ từ $with và tải nó bằng tay: $author->load('books') hay Bạn cũng có thể tải một mối quan hệ của một mối quan hệ theo cách này, ví dụ: $author->load('books', 'books.comments') hoặc Author::with('books', 'books.comments')->where...

Tất cả đi xuống những gì bạn đang cố gắng đạt được. Vì vậy, bạn phải đánh giá những gì và những gì bạn không nên tự động tải.

Hãy cẩn thận khi tải tự động các mối quan hệ trên mô hình của bạn và khi thêm người truy cập vào $appends, đặc biệt là nếu họ sử dụng quan hệ. Nó là một tính năng tuyệt vời nhưng đôi khi có thể cắn cứng.

Các vấn đề liên quan