Laravel: DB Query возвращает stdclass вместо массива - PullRequest
0 голосов
/ 04 мая 2019

У меня есть следующее:

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

и информация журнала дает мне

  49 =>   stdClass::__set_state(array(
 'id' => '46531',
  )),
  50 => 
  stdClass::__set_state(array(
 'id' => '46531',
  )),
  51 => 
  stdClass::__set_state(array(
 'id' => '46531',
  )),

Что я хотел бы иметь:
вернуть запись ОДНАЖДЫ, естьнесколько записей с этим идентификатором в таблице "ad_service", и я хотел бы получить его один раз.это отношения многие ко многим.также самая большая проблема, что это за состояние набора stdclass?
Я ожидал что-то вроде:

array('id' => '46531', ...,)

спасибо, ребята.

РЕДАКТИРОВАТЬ: Решено с помощью Eloquent:

$srv = Ad::whereIn('id',[46696,48982,...MORE IDS HERE])->get();

возвращает не объект, а саму коллекцию.я действительно не знаю, что @ourmandave имел в виду под «вы получаете коллекцию с объектами класса std», я имею в виду, очевидно, что я мог это видеть, но я действительно не знаю, почему я получил это, и почему я получаю это, как я хочу, используя eloquent.Любой ответ на этот вопрос будет оценен: почему DB :: возвращает этот класс std, а Eloquent возвращает "требуемый формат"?

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Если вам нужна только одна запись, вы можете попробовать:

$srv = DB::table('ads')
        ->join('ad_service','ad_service.ad_id', '=', 'ads.id')
        ->select('ads.id')
        ->whereIn('ads.id',[45789,46531])
        ->first();

Измените значение на first(). Причина, по которой вы получаете несколько записей, заключается в том, что get() возвращает рекламный текст collection ваших объявлений.

1 голос
/ 04 мая 2019

Вы на самом деле получаете коллекцию lararvel.

Из документов (https://laravel.com/docs/5.8/queries#retrieving-results)

Метод get возвращает Illuminate \ Support \ Collection, содержащую результаты, где каждыйresult является экземпляром объекта PHP stdClass. Вы можете получить доступ к значению каждого столбца, обратившись к столбцу как к свойству объекта:

foreach ($users as $user) {
  echo $user->name; 
}

Существует множество методов, которые они предоставляют для обработки коллекций.они похожи на массивы. (https://laravel.com/docs/5.8/collections#available-methods)

Вы также можете попробовать метод Different (), чтобы получить один из кратных.

  $srv = DB::table('ads')
    ->join('ad_service','ad_service.ad_id', '=', 'ads.id')
    ->select('ads.id')
    ->whereIn('ads.id',[45789,46531])
    ->distinct()
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...