Красноречивое отношение hasMany без идентификатора - PullRequest
0 голосов
/ 17 февраля 2020

Я подсчитать, сколько регистраций существует от одной нации. До сих пор я пришел со следующим решением: Метод внутри контроллера:

class Camp extends Model // ...
{
    protected $with = ['registrations_nation_count',...];
    // ...

    public function registrations_nation_count()
    {
        return $this->hasMany(CampRegistration::class)
            ->select(['camp_id','nation',DB::raw('COUNT(*) as count')])
            ->groupBy('nation');
    }
}

Это генерирует следующий вывод:

      "registrations_nation_count": [
            {
                "camp_id": 1,
                "nation": "en",
                "count": 2
            },
            {
                "camp_id": 1,
                "nation": "fr",
                "count": 1
            }
        ]

Теперь я хотел бы удалить столбец camp_id из выход. Я уже пытался просто удалить его из выбора, но это не приводит к выводу вообще. Есть ли способ скрыть это?

База данных:

+-------+--------------------+
| camps | camp_registrations |
+-------+--------------------+
| id    | id                 |
| ...   | camp_id            |
|       | nation             |
|       | ...                |
+-------+--------------------+

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Вы не можете не выбирать столбцы, которые используются для запроса отношения. В вашем примере это родительская модель id и связанная модель camp_id.

Я бы настоятельно рекомендовал не иметь столбцы ->select([..]) в определении отношений. Это излишне ограничит использование отношения.

Вместо этого вы должны опустить столбцы в каком-то преобразователе (например, Eloquent resources ), который преобразует ресурс для просмотра конечным пользователем. .

0 голосов
/ 17 февраля 2020

Вы, вероятно, хотите сделать что-то вроде:

$camp->registrations_nation_count->makeHidden('camp_id');

После использования 'с'

...