Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 19.10.2016 19:25:24

Владимир

Как сделать выборку только нужных полей из связанных таблиц?

Есть таблица goods и photos. Эти таблицы связаны между собой отношением один ко многим. То есть у одного good может быть много photo. Мне нужно сделать выборку всех good, сразу вместе с со всеми связанными photo. Также нужно выбрать значения не всех полей, а только нужных. И сделать это надо как в товарах, так и в фотографиях. Нужно, чтобы получился такой результат:

array:1 [
  0 => array:3 [
    "id" => 22997
    "name" => "Дроссельная заслонка, TOYOTA, -, 2AZ, Конт., (механич.)"
    "photos" => array:2 [
      0 => array:8 [
        "file_name_1920" => "1920_beab058e9f965a26ca597c3a2d5fad85.jpg"
      ]
      1 => array:8 [
        "id" => 14
        "file_name_1920" => "1920_ae27f461ea19678d07151993e6a30811.jpg""
      ]
    ]
  ]
]

Делаю выборку вот так:

$goods = Good::where('quantity', '>', 0)
        ->select(
            [
                'id',
                'name',
            ])
        ->with(['photos' => function($q)
        {
            $q->select('id', 'file_name_1920');
        }])
        ->orderBy('id', 'desk')->take(1)->get();

    dump($goods->toArray());

В результате получаю выборку без фотографий:

array:1 [
  0 => array:3 [
    "id" => 22997
    "name" => "Дроссельная заслонка, TOYOTA, -, 2AZ, Конт., (механич.)"
    "photos" => []
  ]
]

А если делаю выборку вот так:

$goods = Good::where('quantity', '>', 0)
        ->select(
            [
                'id',
                'name',
            ])
        ->with(['photos' => function($q)
        {
            //$q->select('id', 'file_name_1920');
        }])
        ->orderBy('id', 'desk')->take(1)->get();

    dump($goods->toArray());

То получаю все вместе с good получаю все photos, но вместе с ненужными полями:

array:1 [
  0 => array:3 [
    "id" => 22997
    "name" => "Дроссельная заслонка, TOYOTA, -, 2AZ, Конт., (механич.)"
    "photos" => array:2 [
      0 => array:8 [
        "id" => 13
        "sorting" => 0
        "good_id" => 22997
        "publish" => 1
        "file_name_1920" => "1920_beab058e9f965a26ca597c3a2d5fad85.jpg"
        "file_name_fit_640" => "fit_640_beab058e9f965a26ca597c3a2d5fad85.jpg"
        "created_at" => "2016-10-19 18:23:47"
        "updated_at" => "2016-10-19 18:23:47"
      ]
      1 => array:8 [
        "id" => 14
        "sorting" => 0
        "good_id" => 22997
        "publish" => 1
        "file_name_1920" => "1920_ae27f461ea19678d07151993e6a30811.jpg"
        "file_name_fit_640" => "fit_640_ae27f461ea19678d07151993e6a30811.jpg"
        "created_at" => "2016-10-19 18:23:49"
        "updated_at" => "2016-10-19 18:23:49"
      ]
    ]
  ]
]

Что я делаю не так?

#2 19.10.2016 20:04:07

Re: Как сделать выборку только нужных полей из связанных таблиц?

1. ->orderBy('id', 'desk')->take(1)->get();
достаточно ->orderBy('id', 'desk')->first();

2. попробуй в модели в guard запихать поля, которые не хочешь светить во вне. а можно в hidden запихать.
вот чёрт, а не помню в каком состоянии они нередектируемы...

имеется ввиду, что это необходимо сделать внутри конкретной модели путём редактирования соответствующих свойств.

Не в сети

#3 24.10.2016 09:31:34

Re: Как сделать выборку только нужных полей из связанных таблиц?

>> попробуй в модели в guard запихать поля

guard совсем не то - это защита от массового заполнения

тут скорее всего надо hidden - но он только для отдачи в json. В самом объекте эти поля будут.

Не в сети

#4 24.10.2016 12:13:26

Re: Как сделать выборку только нужных полей из связанных таблиц?

DBR пишет:

>> попробуй в модели в guard запихать поля

guard совсем не то - это защита от массового заполнения

тут скорее всего надо hidden - но он только для отдачи в json. В самом объекте эти поля будут.

так ему и надо их от выдачи спрятать - это самое дешёвое решение.
а ко ли таблица шириной не 40 колонок, то заморачиваться на этом этапе вырезанием из запроса матрёшек нет смысла, но это пока не 40 колонок в таблице...

Изменено hzone (24.10.2016 12:14:40)

Не в сети

Подвал раздела