Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Hubungan model (Laravel 5.2)

Ini adalah bagaimana saya pikir Anda dapat memiliki awal yang baik...

Pertama-tama, model dan migrasi Anda dapat menangani semuanya.

Ada untuk hubungan:Hubungan Laravel 5.2 Ada untuk migrasi:Migrasi Laravel 5.2

Jadi di sana Anda membuat migrasi Anda:

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();
});

Jadi, setelah Anda melakukan ini, Anda dapat membuat hubungan Anda menjadi model Anda. Dengan cara ini Anda tidak memerlukan semua tabel "antara". Saat Anda akan menggunakan associate(), Laravel akan membuatkan tautan untuk Anda. Dengan cara ini Anda dapat melakukan sesuatu seperti ini:$offer->store()->name untuk mendapatkan nama toko dari penawaran saat ini. Lihat:

Ke dalam model Toko

public function products()
{
    return $this->hasMany(Product::class);
}

public function offers()
{
    return $this->hasMany(Offer::class);
}

Ke dalam model Penawaran

public function store()
{
    return $this->belongsTo(Store::class);
}

Dengan cara ini, Anda membuat hubungan satu-ke-banyak. Sudah saya katakan, $offer->store() akan mengambil toko penawaran. $store->offers()->get() akan mengambil semua penawaran toko.

Semoga membantu.

EDIT

Hanya ada satu masalah dengan apa yang saya katakan. n + 1 masalah . Jadi seperti itu jelaskan di sana (cari google "laravel n+1 problem" dan pilih tautan ke laracast) (tidak dapat menempatkannya sebagai tautan, reputasi tidak cukup), ketika Anda memanggil hal-hal seperti yang saya katakan, skrip akan melakukan 2 pertanyaan. Saat Anda menggunakan loop foreach(), kueri loop +1 akan memiliki sebanyak mungkin kueri. Saya menyarankan Anda untuk melakukan hal-hal seperti itu

$offers = Offer::with('store')->all();

Dengan cara ini Anda hanya akan memiliki 1 kueri dan Anda masih dapat melakukan

$offer->store;

tanpa melakukan kueri lain.

Saat Anda menggunakan $model =Model::with('something')->all();, kueri akan mengambil data dari 2 tabel dan mengembalikan hasilnya dengan array ke dalam array. Seperti ini:

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

Anda dapat menggunakan kebalikannya:

$stores = Store::with('offers')->all();

Jadi Anda dapat menggunakan:

$store->offers[i]->somthing;

Karena array akan terlihat seperti ini:

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. perbandingan truncate vs delete di mysql/sqlserver

  2. Mysql tidak menggunakan indeks dalam kueri dengan offset

  3. Menerapkan satu login untuk tiga situs web di PHP?

  4. virtualenv yang dapat menemukan pustaka yang dipindahkan (seperti lib mysqlclient untuk MySQLdb)

  5. Menghubungkan ke Mysql menggunakan Slick 3.0 - Tidak ada nama pengguna, tidak ada kata sandi dan driver palsu tidak sama dengan kesalahan