Laravel 5

Relation eloquent et query builder

  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    25

    Bonjour,

    Je suis plutôt débutant sur lavarel mais je me lance je souhaite développer un réseau social.
    J'ai un petit soucis lorsque je souhaite récupérer des données via des clèf étrangères.
    Je m'explique :
    J'ai deux table :
    User
    ---id
    ---Name
    ---city
    ---email, ect
    User_set
    ---id
    ---user-id
    ---set1
    ---set2, ect...

    Je donne a l'utilisateur la possibilité de retrouver d'autre utilisateur en utilisant une barre de recherche. Donc j'utilise ma route qui utilise le controller Search

    <?php

    namespace App\Http\Controllers;

    use Illuminate\Http\Request;
    use App\User;

    class SearchController extends Controller
    {
    public function search(Request $request) {
    $search=$request->all();
    $public=User::where('name','like', $search)
    ->orWhere('city','like',$search)
    ->orWhere('city_born','like',$search)
    ->orWhere('birthday','like',$search)
    ->get();

    return view('search')->with('public', $public);
    }
    }

    Jusque là, pas de soucis, je recupère bien mon tableau. Mais maintenant si je veux recuperer les colonnes de ma table User_Set en fonction des id trouvé par la requête je coince.
    J'ai suivie un peu la doc de laravel j'ai ajouté la fonction sur mon model User

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

    Enfin j'ai accès à $userset = User::find(x)->userset;
    Mais comment passé le tableau des id dans la function find sans passé par foreach ? Vulgairement j'aimerais faire celà

    $userset = User::find(
    foreach($public as $key) { $public->id }
    )->userset;

    Merci par avance

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

    Salut,

    Essaie comme ça :

    $result=User::where('name','like', $search)
    ->orWhere('city','like',$search)
    ->orWhere('city_born','like',$search)
    ->orWhere('birthday','like',$search)
    ->userset()
    ->get();
  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    25

    Hello,

    Merci pour ta rapidité, mais celà ne fonctionne toujours pas , j'ai l'erreur
    Call to undefined method Illuminate\Database\Eloquent\Builder::userset()

    Impossible de trouver

  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    25

    Ok j'ai trouvé sur un forum

    $public=User::with('userset')
    ->where('name','like', $request->input('search') . '%')
    ->orWhere('city','like', $request->input('search') . '%')
    ->orWhere('city_born','like', $request->input('search') . '%')
    ->orWhere('birthday','like', '%' . $request->input('search') . '%')
    ->get();
    @foreach($public as $key)
    {{$key->name}}
    {{$key->userset}}
    @endforeach
  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    25

    Hello,

    J'ai de nouveau un problème pour afficher ma requête maintenant.
    Quand je fais

    @foreach($public as $key)

    {{$key->name}}

    {{$key->userset}}

    @endforeach

    ça me retourne Alexis Gatuingt [{"id":4,"user_id":65,"created_at":"2019-01-06 12:39:24","updated_at":"2019-01-06 12:39:24"}]
    Donc cool mais prochainement je vais avoir des informations a récupéré dans cette table, comment je peux faire pour récupéré, par exemple ici, l'user_id ?

  • Avatar de bestmomo
    Membre depuis :
    07/04/2013
    Messages :
    2472
    $key->userset->user_id
  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    25

    Hello,

    Déjà essayé
    Property [user_id] does not exist on this collection instance. (View: C:\Users\alexi\Desktop\jesuisnele\www\resources\views\search.blade.php)

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

    Comme tu as une relation hasMany il est possible que tu récupères plusieurs enregistrements liés.

    Ca donne quoi un dd($key->userset) ?

    Classiquement dans cette situation on a ça :

    @foreach($public as $key)
    {{$key->name}}
    @foreach($key as $k)
    {{$k->user_id}}
    @endforeach
    @endforeach
  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    25

    Re, c'est bon je viens de trouver la solution après trois jours 😪

    dd($key->userset) donne :

    Collection {#246 ▼
    #items: array:1 [▼
    0 => UserSet {#248 ▼
    #fillable: array:1 [▼
    0 => "user_id"
    ]
    #connection: "mysql"
    #table: "user_sets"
    #primaryKey: "id"
    #keyType: "int"
    +incrementing: true
    #with: []
    #withCount: []
    #perPage: 15
    +exists: true
    +wasRecentlyCreated: false
    #attributes: array:4 [▶]
    #original: array:4 [▶]
    #changes: []
    #casts: []
    #dates: []
    #dateFormat: null
    #appends: []
    #dispatchesEvents: []
    #observables: []
    #relations: []
    #touches: []
    +timestamps: true
    #hidden: []
    #visible: []
    #guarded: array:1 [▶]
    }
    ]
    }

    Il fallait juste que je rajoute [0] sur ma collection

    {{$key->userset[0]->user_id}}

    Merci pour ton temps et ton aide en tout cas ^^, je vais pouvoir avancer
    A+

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

    Si tu as un seul enregistrement lié alors tu n'as pas choisi la bonne relation, il faut prendre hasOne. Ainsi tu n'aurais pas une collection à l'arrivée (qui t'oblige à préciser que tu veux le premier enregistrement) mais directement un seul enregistrement.

  • Avatar de AlexisGatuingt
    Membre depuis :
    06/01/2019
    Messages :
    25

    Oui mais je risque d'avoir plusieurs relations a la longue, j'ai préferé bien comprendre le système et anticipé au maximun

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

    Alors pour anticiper au maximum fais une boucle sur les résultats ;)

Vous ne pouvez pas répondre à ce sujet.