6 votes

Appartient au tableau croisé dynamique dans Laravel 5

Disons que j'ai le schéma de base de données suivant :

enter image description here

dogs y owners sont liés aux classiques belongsToMany . Que pensez-vous de la walks table ? J'aimerais pouvoir utiliser les goodies d'Eloquent dans ce type de relation :

$dogs = Dog::with('walks')->get();
$walks = Walk::with('dogs')->get();

En théorie, je pourrais remplacer dog_owner_id avec deux colonnes distinctes : dog_id y owner_id . Cela faciliterait l'utilisation d'Eloquent, mais je perdrais une partie de l'intégrité des données, parce que le chien et le propriétaire non apparentés pourraient potentiellement aller se promener (et ce n'est sûr ni pour l'un ni pour l'autre !).

Sur Marche.php comment définir ces relations ?

public function dog() {
    // return ???;
}

Et si Chien.php y Propriétaire.php ?

public function walks() {
    // return ???;
}

8voto

Esraa Gamal Points 1

1- créer 4 modèles (Walk,Dog,Owner,DogOwner)

2- dans le modèle Walk.php

    public function dog()
{

    return $this->hasOneThrough(
        'App\Models\Dog',
        'App\Models\DogOwner',
        'id', // Local key on dog_owner table...
        'id', // Local key on dogs table...
        'dog_owner_id', // Foreign key on walks table...
        'dog_id' // Foreign key on dog_owner table...
    );
}

public function owner()
{

    return $this->hasOneThrough(
        'App\Models\Owner',
        'App\Models\DogOwner',
        'id', // Local key on dog_owner table...
        'id', // Local key on owners table...
        'dog_owner_id', // Foreign key on walks table...
        'owner_id' // Foreign key on dog_owner table...
    );
}       

3- dans le modèle Dog.php

   public function walks()
    {
    return $this->hasManyThrough(
        'App\Models\Walk',
        'App\Models\DogOwner',
        'dog_id', // Foreign key on dog_owner table...
        'dog_owner_id', // Foreign key on walks table...
        'id', // Local key on dogs table...
        'id' // Local key on dog_owner table...
    );
    }   

4- dans le modèle Owner.php

   public function walks()
   {
    return $this->hasManyThrough(
        'App\Models\Walk',
        'App\Models\DogOwner',
        'owner_id', // Foreign key on dog_owner table...
        'dog_owner_id', // Foreign key on walks table...
        'id', // Local key on owners table...
        'id' // Local key on dog_owner table...
    );
   }

0voto

Stephan-v Points 5303

Comme d'autres l'ont mentionné, vous pouvez utiliser HasManyThrough pour cela :

https://laravel.com/docs/5.5/eloquent-relationships#has-many-through

Comme vous l'avez dit, ceci est valable pour vos modèles Chien et Propriétaire. Pour votre modèle Walk, c'est un peu différent, mais vous avez la possibilité de mapper la requête vous-même :

return $this->hasManyThrough(
    'App\Post',
    'App\User',
    'country_id', // Foreign key on users table...
    'user_id', // Foreign key on posts table...
    'id', // Local key on countries table...
    'id' // Local key on users table...
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X