2013-05-05 41 views
6

Tôi hiện đang gặp sự cố với mối quan hệ: n với Laravel 4, tôi đang gặp lỗi với bảng tổng hợp đang quering trên bảng với cả hai thành phần trên tên ít. Tôi tạo ra một trục lands_objs bảng và cư nó:Laravel 4 nhiều mối quan hệ không hoạt động, bảng tổng hợp không tìm thấy

Models là:

<?php 
    class Obj extends Eloquent 
    { 
     protected $guarded = array(); 
     public static $rules = array(); 
     public $timestamps = false; 
     public function land() 
     { 
      return $this->belongsToMany('Land'); 
    } 

<?php 

    class Land extends Eloquent 
    { 
     protected $guarded = array(); 
     public static $rules = array(); 
     public $timestamps = false; 

     public function objs() 
     { 
      return $this->belongsToMany('Obj'); 
     } 
    } 

Dưới đây là cách tôi cư trú trong pivot table theo các tiêu chuẩn. Tất nhiên đất, objs và lands_objs bảng tồn tại:

<?php 

use Illuminate\Database\Migrations\Migration; 

class CreateLandsObjsTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('lands_objs', function($table) { 
      $table->integer('land_id'); 
      $table->integer('obj_id'); 
     }); 
    } 
} 

Với cấu trúc này, tôi sẽ có thể làm nhờ hùng biện:

$land = Land::find(1); //checked loads land fine 
$objs = $land->objs; //--> HERE I TAKE THE ERROR 

Nhưng tôi coi các lỗi:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'taylor.land_obj' doesn't exist 
(SQL: select `objs`.*, `land_obj`.`land_id` as `pivot_land_id`, `land_obj`.`obj_id` 
as `pivot_obj_id` from `objs` inner join `land_obj` on `objs`.`id` = `land_obj`.`obj_id` 
where `land_obj`.`land_id` = ?) (Bindings: array (0 => 1,)) 

Laravel không nên tạo bảng lands_objs bất chấp việc quering trên land_obj? Tui bỏ lỡ điều gì vậy?

Cảm ơn rất nhiều.

Trả lời

13

Các bảng pivot nên phiên bản duy nhất của các tên bảng nó được liên kết, trong thứ tự chữ cái như vậy trong trường hợp của bạn:

land_obj hơn lands_objs

Nếu bạn thực sự không muốn sử dụng mặc định quy ước đặt tên bạn cũng có thể chỉ định tên bảng là param thứ 2 trên gọi belongsToMany trong mô hình của bạn:

return $this->belongsToMany('Obj', 'lands_objs'); 

return $this->belongsToMany('Land', 'lands_objs'); 

Để biết thêm thông tin, xem docs here

+0

Bạn có thể cho tôi biết sự khác biệt giữa việc sử dụng 2 ** belongsTo ** phương pháp và các ** hasManyThrough ** Phương pháp là gì? Tôi không hiểu, nhưng việc sử dụng hasManyTrough không hoạt động đối với tôi ... – kitensei

+0

Với kịch bản, Tác giả có nhiều Bài đăng và Bài đăng có nhiều Nhận xét. Bạn sẽ có 2 thuộc về các phương thức thông thường (tác giả để đăng và gửi bình luận), tuy nhiên bạn muốn chọn tất cả các nhận xét trên tất cả các bài đăng cho một tác giả cụ thể, sau đó bạn sẽ sử dụng hasManyThrough vì các nhận xét không liên quan trực tiếp đến Tác giả nhưng chúng liên quan đến Tác giả qua một mô hình khác (bài đăng). Nếu không có hasManyThrough, bạn phải chọn tất cả các bài viết của tác giả, sau đó lặp lại chúng nhận tất cả các nhận xét, sau đó thực hiện một số loại xử lý để đưa chúng vào định dạng/thứ tự vv mà bạn đã theo dõi. – Brent

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