Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Relacje modeli (Laravel 5.2)

Myślę, że w ten sposób możesz mieć dobry początek...

Przede wszystkim Twój model i migracja mogą to wszystko obsłużyć.

Istnieje związek:Związek Laravel 5.2 Jest do migracji:Migracja Laravel 5.2

Więc tam tworzysz swoją migrację:

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

Więc kiedy już to zrobisz, możesz zmienić swój związek na swój model. W ten sposób nie potrzebujesz wszystkich „pomiędzy” stołami. Kiedy użyjesz Associate(), Laravel utworzy dla Ciebie link. W ten sposób możesz zrobić coś takiego:$offer->store()->name, aby uzyskać nazwę sklepu z aktualną ofertą. Spójrz:

Do modelu sklepu

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

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

Do modelu oferty

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

W ten sposób tworzysz relację jeden-do-wielu. Jak już powiedziałem, $offer->store() pobierze sklep z ofertą. $store->offers()->get() pobierze całą ofertę sklepu.

Mam nadzieję, że to pomoże.

EDYTUJ

Jest tylko jeden problem z tym, co powiedziałem. Problem n + 1 . Więc tak jak to wyjaśniono (wyszukaj w google "laravel n+1 problem" i wybierz link do laracast) (nie można umieścić go jako linku, za mało reputacji) , kiedy nazwiesz rzeczy takie, jak powiedziałem, skrypt zrobi 2 zapytanie. Kiedy używasz pętli foreach(), będzie ona miała tyle samo zapytań pętli +1. Proponuję robić takie rzeczy

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

W ten sposób będziesz mieć tylko 1 zapytanie i nadal będziesz mógł to zrobić

$offer->store;

bez wykonywania kolejnego zapytania.

Kiedy użyjesz $model =Model::with('something')->all();, zapytanie pobierze dane z 2 tabeli i zwróci wynik z tablicą do tablicy. Tak:

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

Możesz użyć przeciwnego:

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

Możesz więc użyć:

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

Ponieważ tablica będzie wyglądać tak:

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. Błąd niezdefiniowanego przesunięcia w php podczas importowania CSV

  2. group_concat Nowa linia MYSQL

  3. grupuj według wartości niezerowych

  4. wiele tabel SQL z PHP do generowania mapy witryny

  5. Jak uzyskać łączną liczbę użytkowników dziennie w MySQL?