Mysql
 sql >> база данни >  >> RDS >> Mysql

Връзки на модели (Laravel 5.2)

Ето как мисля, че можете да започнете добре...

Първо, вашият модел и миграция могат да се справят с всичко.

Има за връзка:Връзка Laravel 5.2 Има за миграция:Миграция на Laravel 5.2

И така, вие създавате вашата миграция:

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

Така че, след като направите това, можете да направите връзката си по вашия модел. По този начин нямате нужда от всички "между" маси. Когато използвате associate(), Laravel ще създаде връзката вместо вас. По този начин можете да направите нещо подобно:$offer->store()->name, за да получите името на магазина на текущата оферта. Разгледайте:

В модела на Store

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

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

В модела на оферта

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

По този начин вие създавате връзка "един към много". Казах ли, $offer->store() ще извлече магазина на офертата. $store->offers()->get() ще извлече всички оферти от магазина.

Надявам се да помогне.

РЕДАКТИРАНЕ

Има един единствен проблем с това, което казах. Проблемът n + 1 . Така че като го обяснете там (потърсете в Google „laravel n+1 problem“ и изберете връзката към laracast) (не мога да го поставя като връзка, няма достатъчно репутация), когато извиквате неща, както казах, скриптът ще направи 2 заявка. Когато използвате foreach() цикъл, той ще има също толкова цикъл +1 заявка. Предлагам ви да правите такива неща

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

По този начин ще имате само 1 заявка и пак ще можете да правите

$offer->store;

без да правите друга заявка.

Когато използвате $model =Model::with('something')->all();, заявката ще извлече данни от таблица 2 и ще върне резултата с масив в масив. Като това:

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

Можете да използвате обратното:

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

Така че можете да използвате:

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

Тъй като масивът ще изглежда така:

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. Как да промените стойността по подразбиране на колона с помощта на процедура

  2. MySQL Автоматично увеличаване на колоните при TRANSACTION, COMMIT и ROLLBACK

  3. Функция за сериализиране на PHP - Добавяне на сериализирани данни към mysql и след това извличане и показване

  4. Как да внедрите php-mysql данни за страници с помощта на доставчици на данни

  5. mysql заявка - вмъкване на данни unix_timestamp (сега ()) проблем