Đây là cách tôi nghĩ bạn có thể có một khởi đầu tốt ...
Trước hết, mô hình và quá trình di chuyển của bạn có thể xử lý tất cả.
Có cho mối quan hệ: Mối quan hệ Laravel 5.2 Có để di chuyển: Laravel 5.2 Migration
Vì vậy, ở đó bạn tạo di chuyển của mình:
Schema::create('stores', function (Blueprint $table) {
$table->bigIncrements('id')->unsigned();
$table->string('name', 50);
$table->timestamps();
});
Schema::create('items', function (Blueprint $table) {
$table->bigIncrements('id')->unsigned();
$table->bigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->text('title');
$table->longText('content');
$table->timestamps();
});
Schema::create('products', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('store_id')->unsigned();
$table->foreign('store_id')->references('id')->on('stores');
$table->decimal('reviews', 7,1);
$table->timestamps();
});
Schema::create('offers', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('store_id')->unsigned();
$table->foreign('store_id')->references('id')->on('stores');
$table->bigInteger('item_id')->unsigned();
$table->foreign('item_id')->references('id')->on('items');
$table->decimal('price', 7,2);
$table->string('url', 255);
$table->dte('start_date');
$table->dte('end_date');
$table->timestamps();
});
Vì vậy, một khi bạn đã làm điều này, bạn có thể thực hiện mối quan hệ của bạn với mô hình của bạn. Bằng cách này, bạn không cần tất cả các bảng "giữa". Khi bạn sử dụng affiliate (), Laravel sẽ tạo liên kết cho bạn. Bằng cách này, bạn có thể làm như sau:$ offer-> store () -> name để lấy tên cửa hàng của ưu đãi hiện tại. Hãy xem:
Mô hình của Into Store
public function products()
{
return $this->hasMany(Product::class);
}
public function offers()
{
return $this->hasMany(Offer::class);
}
Vào mô hình của Phiếu mua hàng
public function store()
{
return $this->belongsTo(Store::class);
}
Bằng cách này, bạn tạo mối quan hệ một-nhiều. Tôi đã nói chưa, $ offer-> store () sẽ truy xuất cửa hàng của phiếu mua hàng. $ store-> offer () -> get () sẽ truy xuất tất cả các ưu đãi của store.
Hy vọng nó sẽ giúp ích.
CHỈNH SỬA
Có một vấn đề duy nhất với những gì tôi đã nói. n + 1 sự cố . Vì vậy, thích nó giải thích ở đó (tìm kiếm google "laravel n + 1 vấn đề" và chọn liên kết đến laracast) (không thể đặt nó là một liên kết, không đủ uy tín), khi bạn gọi những thứ như tôi đã nói, script sẽ làm 2. truy vấn. Khi bạn sử dụng vòng lặp foreach (), nó sẽ có càng nhiều truy vấn vòng lặp +1. Tôi đề nghị bạn làm những việc như vậy
$offers = Offer::with('store')->all();
Bằng cách này, bạn sẽ chỉ có 1 truy vấn và bạn vẫn có thể thực hiện
$offer->store;
mà không cần thực hiện một truy vấn khác.
Khi bạn sử dụng $ model =Model ::with ('something') -> all ();, truy vấn sẽ lấy dữ liệu từ 2 bảng và trả về kết quả có một mảng thành một mảng. Như thế này:
offers {
[0]:{a,b,c,d,e, store{a,b,c,d,e}}
[1]:{a,b,c,d,e, store{a,b,c,d,e}}
[2]:{a,b,c,d,e, store{a,b,c,d,e}}
[3]:{a,b,c,d,e, store{a,b,c,d,e}}
}
Bạn có thể sử dụng ngược lại:
$stores = Store::with('offers')->all();
Vì vậy, bạn có thể sử dụng:
$store->offers[i]->somthing;
Bởi vì mảng sẽ giống như thế này:
stores {
[0]:{a,b,c,d,e, offers{
[0]:{a,b,c,d,e}
[1]:{a,b,c,d,e}
[2]:{a,b,c,d,e}
[3]:{a,b,c,d,e}
}}
[1]:{a,b,c,d,e, offers{
[0]:{a,b,c,d,e}
[1]:{a,b,c,d,e}
[2]:{a,b,c,d,e}
[3]:{a,b,c,d,e}
}}
[2]:{a,b,c,d,e, offers{
[0]:{a,b,c,d,e}
[1]:{a,b,c,d,e}
[2]:{a,b,c,d,e}
[3]:{a,b,c,d,e}
}}
}