web-dev-qa-db-ja.com

Laravel hasManyおよびbelongsToパラメータ

テーブルストアがあり、ストアには多くのライブラリがあり、ライブラリにはストアstore_id

店舗テーブル

id(PK)

図書館テーブル

id(PK)
store_id(FK)

私はhasManyおよびbelongsToパラメーターが含まれていると混同しています。 docs

return $ this-> hasMany( 'App\Comment'、 'foreign_key');

return $ this-> hasMany( 'App\Comment'、 'foreign_key'、 'local_key');

return $ this-> belongsTo( 'App\Post'、 'foreign_key'、 'other_key');

HasMany foreign_keyとlocal_keyのどのテーブルからのものですか? belongsToと同じで、foreign_keyとother_keyのテーブルはどこから来ましたか?

店舗モデル

public function library(){
    return $this->hasMany('App\Library', 'what_foreign_key_should_be_here','what_other_key_should_be_here');
}

図書館モデル

public function stores(){
    return $this->belongsTo('App\Stores', 'what_foreign_key_should_be_here', 'what_other_key_should_be_here');
}

テーブルの主キーIDをsidなどの他の名前に変更することがあるため、常に外部キーと主キーを指定する必要があるため

7
Naib Sorion

構文を単純化するために、return $this->hasMany('App\Comment', 'foreign_key', 'local_key');パラメーターを次のように考えてください。

  1. リンクするモデル
  2. 現在のテーブルのid列にリンクする外部テーブル(リンクしているテーブル)の列(3番目のパラメーターを指定している場合を除き、その場合はそれを使用します)
  3. 使用する現在のテーブルの列-つまり、他のテーブルの外部キーを現在のテーブルのid列にリンクさせたくない場合

あなたの状況では、librariesテーブルでstore_idを使用しているので、あなたは自分の人生を楽にしました。 Storeモデルで定義されている場合、以下は完全に機能するはずです。

public function libraries()
{
    return $this->hasMany('App\Library');
}

舞台裏では、Laravel=は自動的にidテーブルのStore列をLibrarystore_id列にリンクします表。

明示的に定義する場合は、次のようにします。

public function libraries(){
    return $this->hasMany('App\Library', 'store_id','id');
}
  • モデルの標準では、単数形の関数はbelongsToを返し、複数形の関数はhasManyを返します(つまり$store->libraries() or $library->store())。
12
James

これを試してください。できます。これをモデルに追加します。

ライブラリモデル

_public function store()
    {
        return $this->belongsTo(Store::class, 'store_id', 'id');
    }
_

モデルの保存

_ public function libraries()
    {
        return $this->hasMany(Library::class);
    }
_

サンプルコード

_ $store = Store::find(1);
 dd($store->libraries);
_

この場合、ストアには多くのライブラリがあるため、Storeモデルにはlibraries()関数があります。この標準の詳細については、 James 'answer の最後の行を参照してください。

7
Kenneth