2014-10-07 20 views
8

Tôi cần sử dụng id của bảng tổng hợp làm khóa ngoại trong bảng khác.Laravel Eloquent - Sử dụng id của bảng tổng hợp làm khóa ngoài trong bảng khác

bảng ví dụ tôi đã sau:

users: id, username, ... 

places: id, placename, lat, lng, ... 

place_user: id, user_id, place_id 

routes: place_user_id, lat, lng, inserted_at. 

nên khi người dùng nói tôi sẽ đến nơi đó, tôi có một gương mặt mới trong bảng place_user và bắt đầu đăng nhập con đường ông cần để đạt được điều đó. Vì vậy, đối với mỗi entry_user tôi có nhiều mục trong bảng tuyến.

cách chính xác để thực hiện loại mối quan hệ này bằng cách sử dụng hùng biện là gì? Tôi có nên tạo mô hình cho bảng tổng hợp không?

Tôi đã cố gắng để giải quyết vấn đề của tôi bởi các giải pháp sau đây nhưng không có may mắn: https://github.com/laravel/framework/issues/2093#issuecomment-39154456 và đăng một bình luận có https://github.com/laravel/framework/issues/2093#issuecomment-58187802

bất cứ đề nghị sẽ được đánh giá cao.

+0

Nếu tôi hiểu đúng, bạn muốn một mối quan hệ giữa 'users' và' places', sử dụng bảng 'place_user'. Bảng 'routes' là gì? – Jerodev

+0

Tôi có nhiều mối quan hệ giữa người dùng và địa điểm, và mối quan hệ một với nhiều giữa các tuyến đường và bảng mối quan hệ place_user. – KoKo

+0

Bạn cần sử dụng mô hình bổ sung cho bảng tổng hợp, một mô hình mở rộng 'Mô hình' (' Eloquent') không phải là 'Pivot'. 'Pivot' có hàm tạo sẽ làm cho nó không thể làm việc được. Nếu bạn cần sử dụng thuộc tính 'pivot' (trong ngữ cảnh của một quan hệ) thì bạn cũng cần mô hình trục tùy chỉnh (chỉ mở rộng' Pivot') cho trường hợp này. –

Trả lời

10

Sau nhiều tìm kiếm và cố gắng giải pháp khác nhau tôi đã đưa ra các giải pháp sau đây:

tài mẫu:

class User extends \Eloquent { 
    public function places() { 
     return $this->hasMany('PlaceUser')->with('Place'); 
    } 
} 

Place Model:

class Place extends \Eloquent { 
    public function users() { 
     return $this->hasMany('PlaceUser')->with('User'); 
    } 
} 

PlaceUser Mẫu:

class PlaceUser extends \Eloquent { 

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

    public function place() { 
     return $this->belongsTo('Place'); 
    } 

    public function footprints() { 
     return $this->hasMany('Footprint'); 
    } 
} 

Tôi đã đổi tên tuyến đường thành dấu chân để tránh các vấn đề với lớp tuyến đường có trong laravel.

Footprint mẫu:

class Footprint extends \Eloquent { 
    public function place_user() 
    { 
     return $this->belongsTo('PlaceUser'); 
    } 
} 

Cuối cùng tôi nhận được cấu trúc nơi tôi có thể làm cho các truy vấn khác nhau như:

// gets all places with corresponding pivot table entries and users table entries  
Place::with('users')->get(); 
// get user with id=1 including corresponding pivot table entries and places table entries 
User::with('places')->find(1); 
// get footprint of the user 
$user->places->get(0)->footprints 

hy vọng điều này giúp

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