sql >> Database teknologi >  >> RDS >> Mysql

Relationer mellem modeller (Laravel 5.2)

Sådan tror jeg, du kan få en god start...

Først og fremmest kan din model og migration klare det hele.

Der er for forholdet:Laravel 5.2 Relationship Der er til migrering:Laravel 5.2 Migration

Så der opretter du din migrering:

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

Så når du først har gjort dette, kan du gøre dit forhold til din model. På denne måde behøver du ikke alle "mellem" borde. Når du vil bruge associate(), vil Laravel oprette linket for dig. På denne måde kan du gøre noget som dette:$offer->store()->name for at få navnet på butikken for det aktuelle tilbud. Tag et kig:

Ind i butikkens model

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

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

Into Offers model

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

På denne måde skaber du en en-til-mange relation. Har jeg sagt, $offer->store() vil hente butikken af ​​tilbuddet. $store->offers()->get() vil hente alle tilbud fra butikken.

Håber det hjælper.

REDIGER

Der er kun et problem med det, jeg sagde. n + 1-problemet . Så forklar det der (søg på google "laravel n+1 problem" og vælg linket til laracast) (kan ikke sætte det som et link, ikke nok ry), når du kalder ting som jeg sagde, vil scriptet gøre 2 forespørgsel. Når du bruger en foreach()-løkke, vil den have lige så meget loop +1-forespørgsel. Jeg foreslår, at du gør sådan noget

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

På denne måde har du kun 1 forespørgsel, og du vil stadig være i stand til at gøre

$offer->store;

uden at foretage en anden forespørgsel.

Når du bruger $model =Model::with('noget')->all();, vil forespørgslen hente data fra 2 tabel og returnere resultatet med et array til et array. Sådan:

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

Du kan bruge det modsatte:

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

Så du kan bruge:

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

Fordi arrayet vil se sådan ud:

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. Sikkerhedskopier en mysql-database og download som en fil

  2. Får du en PHP PDO-forbindelse fra en mysql_connect()?

  3. Hvordan kan jeg lukke Oracle DbLinks i JDBC med XA-datakilder og transaktioner for at undgå ORA-02020-fejl?

  4. Mysql - Opsummering af antallet af flere sammenføjede tabeller