0

J'ai 3 tables utilisateurs, articles et metas. J'avais défini morphTo() et morphToMany() en fonction du document laravel 5.3 et je peux extraire toute propriété particulière de l'utilisateur ou de l'article défini dans la table des métas, comme prénom, nom ou coordonnée.Recherche des données de laravel meta table de type metable

J'ai maintenant des difficultés à écrire le bon modèle pour rechercher ces propriétés, par exemple une recherche du prénom ou du nom de famille de l'utilisateur, ou les deux.

<u>User table</u> 
id. username. password 
1.  Test.    Testpass 

<u>article</> 
id. Title.      Slug 
1.  My article title. my-article-title 

tableau Metas

Id.  key.    value.     metable_id metable_type 
1  firstname  Ade      1      App\User 
2.  content.  Sample article 1.      App\Article 
3.  lastname.  Keon.     1.     App\User 

Meta.php Extrait

public function metable() { 
    return $this->morphTo(); 
} 

User.php Extrait

public function meta() { 
    return $this->morphToMany('App\User', 'metable'); 
} 

public function getName() { 
    $user = User::find($this->id); 
    $metadata = $user->meta()->whereIn('key', ['firstname', 'lastname']) ; 
    dd($metadata); 
} 

Article.php Extrait

public function meta() { 
    return $this->morphToMany('App\User', 'metable'); 
} 

La fonction getName a fonctionné comme prévu, mais je ne peux pas comprendre comment faire une recherche des métadonnées utilisateur contrairement à la table php/mysql classique rejoint

ne sais pas comment que toute relation polymorphes dans Laravel est nouveau pour moi, mais j'ai trouvé et utilisé quelque chose comme ceux-ci:

public function getSearch() { 
     return User::with(array('metas' => function($query) { 
      $query->where('value', $query); 
     })); 
} 

ou

public function getSearch() { 
     return User::with('metas') 
     ->whereHas('metas', function($query) { 
       $query->where('value', '=', $query); 
      }); 
    } 

Je ne peux pas voir ou raison comment Joi n les tables Laravel

ici est ma nouvelle requête de recherche

public function getResults(Request $request) { 
    $keyword = $request->input('query'); 
    $filterOne = $request->input('minAge'); 
    $filterTwo = $request->input('maxAge'); 

    $query = User::with(['meta' => function ($q) { 
     $q->where('value', 'like', $keyword) 
      ->orWhere(function ($q) { 
       $q->whereBetween('value', [$filterOne,$filtertwo]); 
      }); 
    }])->get(); 

dd($query); 
} 
+0

Veuillez décrire ce que vous avez essayé et ce qui ne fonctionne pas. – TheFallen

+0

Montrez le schéma de votre base de données et vos relations. –

+0

@TheFallen J'avais mis à jour d question comme conseillé – adeguk

Répondre

0

Merci pour la contribution ci-dessus, l'insuffisance de ce qui me poussent effectivement plus difficile à des lectures et de la pensée, je suis finalement tombé sur la use() avec fonction query comme indiqué ci-dessous;

public function getResults(Request $request) { 
     $keyword = $request->input('query'); 
     $filterOne = $request->input('minAge'); 
     $filterTwo = $request->input('maxAge'); 

     if (isset($keyword)) { 
      $query = User::with(['meta' => function ($q) use ($keyword,$filterOne,$filterTwo) { 
       $q->where('value', 'LIKE', $keyword) 
        ->whereBetween('value', [$filterOne, $filterTwo]); 
      }])->get(); 
     } else { 
      $query = User::with(['meta' => function ($q) use ($filterOne,$filterTwo) { 
       $q->whereBetween('value', [$filterOne, $filterTwo]); 
      }])->get(); 
     } 

     dd($query); 
    } 

Ceci me donne le résultat que je recherche; mais je ne suis pas sûr de l'effet sur la performance lorsque vous traitez un grand ensemble de données, mais je suppose que c'est ma prochaine mission.