J'ai ce qui suit:
$srv = Ad::whereIn('id',[46696,48982,...MORE IDS HERE])->get();
et les informations de journal me donnent
array('id' => '46531', ...,)
Ce que je voudrais avoir:
renvoyer l'entrée UNE FOIS, il y a plusieurs entrées avec cet identifiant dans la table "ad_service", et je voudrais la récupérer une fois.
c'est une relation plusieurs à plusieurs.
aussi le plus gros problème, quel est cet état d'ensemble de stdclass?
Je m'attendais à quelque chose comme:
49 => stdClass::__set_state(array( 'id' => '46531', )), 50 => stdClass::__set_state(array( 'id' => '46531', )), 51 => stdClass::__set_state(array( 'id' => '46531', )),
merci les gars.
MODIFIER: Résolu en utilisant Eloquent:
$srv = DB::table('ads')
->join('ad_service','ad_service.ad_id', '=', 'ads.id')
->select('ads.id')
->whereIn('ads.id',[45789,46531])
->get();
Log::info($srv);
cela ne renvoie pas un objet mais une collection elle-même. Je ne sais pas vraiment ce que @ourmandave voulait dire avec "vous obtenez une collection avec des objets de classe std" je veux dire évidemment que je pourrais voir cela mais je ne sais pas vraiment pourquoi je l'ai eu, et pourquoi je l'obtiens comme je le souhaite en utilisant éloquent. Toute réponse à cela serait appréciée: Pourquoi DB :: renvoie-t-il ce truc de classe std et Eloquent renvoie le "format voulu"?
3 Réponses :
Vous récupérez actuellement une collection de grand niveau.
À partir de la documentation ( https://laravel.com/docs/5.8/queries#retrieving-results )
La méthode get renvoie un Illuminate \ Support \ Collection contenant le résultats où chaque résultat est une instance de l'objet PHP stdClass. Vous pouvez accéder à la valeur de chaque colonne en accédant à la colonne en tant que propriété de l'objet:
$srv = DB::table('ads') ->join('ad_service','ad_service.ad_id', '=', 'ads.id') ->select('ads.id') ->whereIn('ads.id',[45789,46531]) ->distinct() ->get();
Il y a beaucoup de méthodes qu'ils fournissent aux collections pour les traiter comme des tableaux. ( https://laravel.com/docs/5.8/collections#available-methods a>)
Vous pouvez également essayer la méthode distinct () pour récupérer l'un des multiples.
foreach ($users as $user) {
echo $user->name;
}
Obtention actuelle: array (0 => stdClass :: __ set_state (array ('id' => '45789',)), 1 => stdClass :: __ set_state (array ('id' => '46531',)),) Vous en avez besoin sous cette forme: {"key" => "val," key2 "=>" val2 "...} une idée?: /
je veux dire {{"key" => "val"}, {"key2", "val2"}}
Si vous ne voulez qu'un seul enregistrement, vous pouvez essayer:
$srv = DB::table('ads')
->join('ad_service','ad_service.ad_id', '=', 'ads.id')
->select('ads.id')
->whereIn('ads.id',[45789,46531])
->first();
Changer le get en first () . La raison pour laquelle vous obtenez plusieurs enregistrements est que get () renvoie une collection laravel de vos annonces.
ce dont j'ai besoin est 1 tableau, avec 1x l'entrée. celui-ci renvoie une erreur avec "L'objet de la classe stdClass n'a pas pu être converti en chaîne"
Pour convertir un modèle et ses relations chargées en un tableau, vous devez utiliser la méthode toArray . Cette méthode est récursive, donc tous les attributs et toutes les relations (y compris les relations de relations) seront convertis en tableaux
Log::info($srv);
Tableau d'impression:
$srv = DB::table('ads')
->join('ad_service','ad_service.ad_id', '=', 'ads.id')
->select('ads.id')
->whereIn('ads.id',[45789,46531])
->get()
->toArray();
Quelle version de Laravel utilisez-vous?
J'utilise laravel version 5.2 dans ce projet