Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mối quan hệ của các mô hình (Laravel 5.2)

Đâ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}
                        }}
}



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Độ dài hàng trung bình cao hơn có thể

  2. Công việc cho mysqld.service không thành công trong Centos 7

  3. Nhóm MySQL của với tham gia bên trái

  4. PHP / Apache:PHP Lỗi nghiêm trọng:Gọi đến hàm không xác định mysql_connect ()

  5. Thông số 'param_name' không được tìm thấy trong bộ sưu tập