web-dev-qa-db-fra.com

Paramètres Laravel hasMany et Appartient

J'ai un magasin de table, et le magasin a beaucoup de bibliothèques, dans la bibliothèque j'ai la clé étrangère du magasin store_id.

Table de magasin

id(PK)

Table de bibliothèque

id(PK)
store_id(FK)

Je suis confus avec les paramètres hasMany et belongsTo incluent, dans docs

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

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

return $ this-> appartientTo ('App\Post', 'foreign_key', 'other_key');

De quelle table hasMany foreign_key et local_key sont-elles venues? De même avec Appartient à quelle table de foreign_key et other_key sont-elles venues?

Modèle de magasin

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

Modèle de bibliothèque

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

Parce que parfois je change l'identifiant de la clé primaire d'une table en un autre nom comme sid, je veux donc toujours spécifier laquelle est la clé étrangère et la clé primaire

8
Naib Sorion

Pour simplifier la syntaxe, considérez les paramètres return $this->hasMany('App\Comment', 'foreign_key', 'local_key'); comme suit:

  1. Le modèle que vous souhaitez lier
  2. La colonne de la table étrangère (la table vers laquelle vous créez un lien) qui renvoie à la colonne id de la table actuelle (sauf si vous spécifiez le troisième paramètre, auquel cas il l'utilisera)
  3. La colonne de la table actuelle qui doit être utilisée - c’est-à-dire si vous ne souhaitez pas que la clé étrangère de l’autre table soit liée à la colonne id de la table actuelle

Dans votre cas, puisque vous avez utilisé store_id dans la table libraries, vous vous êtes rendu la vie facile. Les éléments ci-dessous devraient fonctionner parfaitement lorsqu'ils sont définis dans votre modèle Store:

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

Dans les coulisses, Laravel liera automatiquement la colonne id de la table Store à la colonne store_id de la table Library.

Si vous vouliez le définir explicitement, procédez comme suit:

public function libraries(){
    return $this->hasMany('App\Library', 'store_id','id');
}
  • Un modèle standard est que les fonctions portant un nom singulier renvoient un objet appartient, tandis qu'une fonction plurielle renvoie un hasMany (c'est-à-dire $store->libraries() or $library->store()).
10
James

Essaye celui-là. Ça marche. Ajoutez ceci à votre modèle.

Modèle de bibliothèque

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

Modèle de magasin

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

exemple de code.

 $store = Store::find(1);
 dd($store->library);
1
Kenneth