Laravel 5

Relation avec 2 tables pivot

  • Avatar de VincentPIEPLU
    Membre depuis :
    04/04/2015
    Messages :
    233

    Bonsoir,

    Je me confronte à un souci avec Eloquent. Je vous explique.

    Déjà, je vous joins un schéma de la base de données que j'ai conçu
    http://www.laravelsd.com/share/hQcJcJ

    Donc j'ai des propriétés (properties), j'ai des critères (criteria), et des types (types) + 2 tables pivot

    Critères c'est par exemple, superficie, jardin ....
    Types, c'est par exemple, vente ou location

    Maintenant, un critère peut être lié à une vente OU à une location mais il peut être aussi lié à une vente ET une location.

    Voici les modèles que j'ai conçu :

    Dans Property

    public function criteria()
    {
    return $this->belongsToMany(Criteria::class, 'criterion_property', 'property_id', 'criterion_id')->withPivot('value');
    }

    Dans Criterion

    public function types()
    {
    return $this->belongsToMany(Type::class, 'criterion_type', 'criterion_id', 'type_id');
    }

    Je dois maintenant ressortir la liste des critères de la propriété seulement si le critère à bien le type_id équivalent à la table pivot criterion_type.

    Pas facile à expliquer, j'espère que vous aurez compris ma demande ;)

    Merci encore

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2565

    Salut

    J'ai un peu de mal à comprendre ton schéma, le pivot criterion_type en particulier...

  • Avatar de VincentPIEPLU
    Membre depuis :
    04/04/2015
    Messages :
    233

    Je me suis peut être craqué sur la structure.

    En gros,

    • j'ai une propriété qui a un type "vente". Les ventes ont des critères.
    • J'ai une propriété qui a un type "location". Les locations ont des critères

    Certains critères sont propres aux ventes, d'autres aux locations, et parfois, ils peuvent se retrouver dans les 2.

    Au final,
    je veux les critères de ma propriété 1 qui ont des critères "vente".
    je veux les critères de ma propriété 2 ont ont des critères "location".

    Est ce plus clair comme explications ?

    Merci de ton aide ;)

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2565

    Si tu te comprends déjà c'est bien :)

    Donc tu as des propriétés que tu peux soit vendre, soit louer, dans chacun de ces cas tu as des critères et ces critères peuvent être communs aux ventes et aux locations.

    Si je comprends bien pour une propriété tu peux avoir par exemple superficie 100m², jardin et piscine. Genres de critères qui sont aussi utiles pour une location. La valeur des impôts fonciers par contre n'est pas intéressant pour une location et donc constitue un critère exclusif d'une vente.

    Donc en gros il faut que tu puisses distinguer les critères selon le type (vente ou location).

    Je vois bien comme tables :

    properties
    id
    name
    ...

    criterions
    id
    name
    sale (booléen si le critère concerne la vente)
    leasing (booléen si le critère concerne la location)
    ...

    criterion_property pivot entre properties et criterions
    criterion_id
    property_id
    value

    De cette manière tu devrais facilement gérer tes requêtes...

  • Avatar de VincentPIEPLU
    Membre depuis :
    04/04/2015
    Messages :
    233

    J'avais pensé comme tu proposes sauf que si j'ai d'autres types, ça multiplie le nombre de colonne et je me disais que je pourrais faire plus optimal. Dans l'idée, j'aurais : vente, location, location saisonnière, programme neuf... Tu vois, ça va faire bcp de colonne à la fin, d'où l'idée de partir sur un pivot, mais je n'arrive pas à en extraire les propriétés et critères liés :(

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2565

    Alors effectivement il faut :

    criterions
    id
    name
    ...

    types
    id
    name
    ...

    criterion_type
    criterion_id
    type_id

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2565

    Je vois bien ce genre de requête :

    $criterions = Criterion::whereHas('properties', function ($query) use($property_id) {
    $query->where('properties.id', $property_id);
    })->whereHas('types', function ($query) use($type_name) {
    $query->where('types.name', $type_name);
    })->get();
  • Avatar de VincentPIEPLU
    Membre depuis :
    04/04/2015
    Messages :
    233

    Ok, du coup tu ferais ça en 2 requetes. Je vais essayer ça. Merci

Vous ne pouvez pas répondre à ce sujet.