1
votes

Laravel: DB Query renvoie stdclass au lieu de array

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"?


2 commentaires

Quelle version de Laravel utilisez-vous?


J'utilise laravel version 5.2 dans ce projet


3 Réponses :


1
votes

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; 
}


2 commentaires

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"}}



1
votes

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.


1 commentaires

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"



0
votes

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();


0 commentaires