Bonjour,
Je développe actuellement une petite application pour un promoteur immobilier.
Le problème est le suivant :

Je sois afficher la liste des biens comme cela :

Appartements :

  • Studio
    -Bien 1
    -Bien 2
    -T1
    -Bien 4
    • Bien 10
      Maison
      -T3
      -Bien 1

Etc...etc...

Donc j'ai une catégorie, une sous-catégorie, et un article.
Je dois pouvoir afficher, la catégorie, la sous-catégorie et la liste des biens associés, mais si la sous-catégorie de la catégorie n'a pas d'articles, je ne dois pas afficher la sous-catégorie et si la catégorie n'as pas d'article, je ne dois pas afficher, ni la catégorie ni la sous-catégorie.

Au début j'avais juste fait :
Une relation Category -> Has many Post
Une relation Sous_category -> Has many Post
Et une Post ->belongs to Category , Post belongs To Sous Category

Mais en suite lorsque je dois afficher tout ça, je me suis vite rendu compte que mes relations ne sont pas bonnes, il faudrait qu'à l'enregistrement d'un article, il enregistre la sous-catégorie de la catégorie à laquelle il est associé.
Donc BelongsToMany ?
Et là je seiche, mon cerveau s'emmêle les pinceaux pour mettre en place ma base de donnée et la logique qui en découle,
un petit coup de main please ?? :)

2 réponses


A lire ce que tu a ecris une categorie à plusieurs sous categories et une une sous categories a plusieurs acticles
Du coup dans le modèle categorie il devrait avoir une relation hasMany avec sous categories c'est a dire

public function subcategories()
{
return $this->hasMany(Subcategory::class, 'category_id')
}

au niveau du modèle subcategorie il devrait avec deux relations une avec la categorie et une autre avec les articles .

Mon email (moufking337@gmail.com ) si je peux aider .

public function category()
{
return $this->belongsTo(Category::class,''category_id)
}

public function articles ()
{
return $this->hasMany (Article::class,'subcategory_id')
}

Bonjour et merci de ta réponse,
Ben enfait je pense que c'est un peu plus compliqué, parce que un type à plusieurs sous-types et les sous-types peuvent avoir plusieurs types.
Il peut y avoir des T1 et T2 par exemple dans les appartements et dans les Villas.
Et les sous-types ont des biens qui doivent être et dans un type, et dans un sous type...
Donc j'ai fait ceci :

Mon model Type :

  public function postSubTypes() {
        return $this->belongsToMany(PostSubType::class);
    }

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

Mon model sous-type :

  public function postTypes() {
        return $this->belongsToMany(PostType::class);
    }

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

Et quand j'enregistre un bien, je récupère son post_sub_type_id et son post_type_id
et donc j'ai :

    $type->postSubTypes()->syncWithoutDetaching($subType)

Résultat dans ma vue pour obtenir un listing à savoir par exemple :
Types
Sous-Types associé 1
Bien 1
Bien2
Bien3

Types 2
Sous-Types associé 1
Bien 4

Je fais ceci :

Mon controller :

  public function index()
    {
        $postTypes = PostType::with('PostSubTypes')->with('posts')->get();
        $postSubTypes = PostSubType::with('PostTypes')->with('posts')->get();
       $posts = Post::all();
        return view('post', compact('postTypes','posts','postSubTypes'));
    }

Et dans ma vue :

@foreach($postTypes as $type) {{--Une boucle pour obtenir les nom des mes types--}}
        @if(!$type->posts->isEmpty())  {{--Pour ne pas afficher le nom des types, s'ils n'ont pas de biens--}}
        <span class="title">{{$type->name}}</span>
        @foreach($type->postSubTypes as $subType) {{--Une boucle pour obtenir les nom des mes sous-types associés à mes types--}}
            <span class="subTitle">{{$subType->name}}</span>

                @foreach($posts as  $index => $post)  {{--Une boucle pour obtenir les nom des biens--}}

                    @if($post->post_type_id === $type->id) {{--Pour ne pas afficher les biens qui ne sont pas dans la bon type--}}
                        @if($post->post_sub_type_id === $subType->id) {{--Pour ne pas afficher les biens qui ne sont pas dans la bon sous type--}}      
                                        <span class="post_title">{{$post->name}}</span>
                        @endif
                    @endif

                @endforeach

        @endforeach
        @endif
    @endforeach

Dans ma vue j'aurais aimé éviter cette condition :

                @foreach($posts as  $index => $post)  {{--Une boucle pour obtenir les nom des biens--}}

                    @if($post->post_type_id === $type->id) {{--Pour ne pas afficher les biens qui ne sont pas dans la bon type--}}
                        @if($post->post_sub_type_id === $subType->id) {{--Pour ne pas afficher les biens qui ne sont pas dans la bon sous type--}}      
                                        <span class="post_title">{{$post->name}}</span>
                        @endif
                    @endif

                @endforeach

Mais je n'arrive pas à récupérer seulement les biens qui sont dans les sous-type associé au type dans lequel ils sont.
meme si je fait ça :

                @foreach($subType->posts as  $index => $post)  {{--Une boucle pour obtenir les nom des biens associé au sous type--}}
                                        <span class="post_title">{{$post->name}}</span>
                @endforeach

J'ai les biens associés seulement au sous type, et non au sous-types qui sont eux même associés au type ...

Si quelqu'un à le courage de me lire jusqu'au bout et une solution plus propre je suis preneur :)

Merci