2016-04-06 22 views
9

Tôi đang cố gắng để thiết lập một số video yêu thích đơn giản cho ứng dụng của tôi sử dụng Laravel/Jenssegers MongoDBLaravel Jenssegers MongoDb Các mối quan hệ không hoạt động?

Tôi có hai mô hình:

class Item { 

    public function favorites() 
    { 
     return $this->hasMany('App\Models\User', 'favorites'); 
    } 
} 

class User { 

    public function favorites() 
    { 
     return $this->hasMany('App\Models\Item', 'favorites'); 
    } 
} 

Vì vậy, một mặt hàng có thể có nhiều người sử dụng và người dùng có thể có nhiều mặt hàng hoặc "yêu thích".

Khi tôi cố gắng chạy một truy vấn đơn giản như:

Item::with('favorites')->get(); 

Mối quan hệ cho mục yêu thích là có nhưng một mảng trống.

Bảng favorites rất đơn giản và chỉ có ba cột:

_id, item_id, user_id 

Tôi cũng đã cố gắng sử dụng embedsMany không có may mắn:

return $this->embedsMany('App\Models\User', 'favorites'); 

Tôi cũng đã thử mọi sự kết hợp của các tham số.

return $this->embedsMany('App\Models\User', 'favorites', 'building_id', 'user_id'); 
return $this->embedsMany('App\Models\User', 'favorites', 'user_id', 'building_id'); 
return $this->hasMany('App\Models\User', 'favorites', 'building_id', 'user_id'); 
return $this->hasMany('App\Models\User', 'favorites', 'user_id', 'building_id'); 

kết quả Strange khi sử dụng:

return $this->hasMany('App\Models\User', 'favorites', 'building_id', 'user_id'); 

Chỉ trong tình huống này nó sẽ trả về tất cả người dùng, mặc dù yêu thích chỉ có một kỷ lục.

Đồng thời cố gắng gỡ lỗi bằng cách sử dụng getQueryLog chỉ mang lại cho tôi một mảng trống bất kỳ lúc nào.

print_r(\DB::connection('mongodb')->getQueryLog()); 

Tôi đã thực hiện việc này bằng cách sử dụng mysql và chưa bao giờ gặp sự cố. Vì vậy, không thực sự chắc chắn nơi mà các vấn đề đang đến từ.

+0

Bạn phải ghi nhớ rằng cơ sở dữ liệu NoSQL như MongoDB không có mối quan hệ. Đó là ý tưởng về cơ sở dữ liệu NoSQL. Nếu bạn cần mối quan hệ truyền thống, có lẽ bạn nên cân nhắc sử dụng cơ sở dữ liệu SQL truyền thống (như MySQL hoặc PostgreSQL). – Bald

+0

Chính xác, nếu bạn muốn quan hệ hasMany, bạn phải lồng toàn bộ các cá thể người dùng bên trong đối tượng Mục ví dụ: "{ " người dùng ": [ {" name ":" user1 "}, {" name ":" user2 " } ] } ' –

+0

@Bald Tôi đoán hùng hồn không có tham gia, nó 'sử dụng tải háo hức. Vì vậy, có gì sai khi tìm nạp một số dữ liệu liên quan. Ví dụ bạn sẽ không lưu trữ đối tượng người dùng bên trong bao giờ bình luận của một bài viết phải không? – Rob

Trả lời

3

Bạn có thể thử những thay vào đó, tôi biết điều tương tự của nó, nhưng có thể làm các trick:

use App\User; 
use App\Item; 

class Item { 

    public function favorites() 
    { 
     return $this->hasMany('User'); 
    } 
} 

class User { 

    public function favorites() 
    { 
     return $this->hasMany('Item'); 
    } 
} 

class Favourite { 

     public function users() 
     { 
      return $this->belongsTo('User'); 
     } 

     public function items() 
     { 
      return $this->belongsTo('Item'); 
     } 
    } 

Ngoài ra thêm nghịch đảo của các mối quan hệ trên như: belongsTo. và thử truy vấn này sau đó:

//Just for testing purpose, if raw query returns right result 
$items = DB::table('items') 
->join('favorites','items.id','=','favorites.id') 
->get(); 
Các vấn đề liên quan