Извлечение сводного поля на один уровень выше в laravel

#php #laravel #pivot

#php #laravel #сводная

Вопрос:

У меня есть связь «многие ко многим» со сводной таблицей. Две модели взаимосвязи — это сообщества и персонажи. В сводной таблице у меня есть идентификаторы экземпляров в отношениях и дополнительное поле с именем «member_count» для подсчета количества членов в этом конкретном отношении. Чтобы получить доступ к полю подсчета участников, я включаю следующую функцию в свою модель сообщества, чтобы она всегда возвращалась:

 public function personas()
{
    return $this->belongsToMany('AppPersona')->withPivot('member_count');
}
  

В результате при извлечении сообществ возвращается следующее:

 {
    "id": "3304806f-9172-4690-b9b7-fa672319eaef",
    "name": "Some Community",
    "site_id": "ee09da48-9ba6-42a9-9f72-4d3ca06ffd2f",
    "internal_external": "internal",
    "created_at": "2020-09-11T14:36:23.000000Z",
    "updated_at": "2020-09-11T14:36:23.000000Z",
    "personas": [
        {
            "id": "1447bc79-f54e-49eb-b33d-acc1c43633e5",
            "name": "Some Persona",
            "created_at": "2020-09-11T14:41:27.000000Z",
            "updated_at": "2020-09-11T14:41:27.000000Z",
            "pivot": {
                "community_id": "3304806f-9172-4690-b9b7-fa672319eaef",
                "persona_id": "1447bc79-f54e-49eb-b33d-acc1c43633e5",
                "member_count": 10
            }
        },
        {
            "id": "ca53ec58-a4e8-4330-a5c3-8dea2235b01f",
            "name": "Another Persona",
            "created_at": "2020-09-11T14:41:15.000000Z",
            "updated_at": "2020-09-11T14:41:15.000000Z",
            "pivot": {
                "community_id": "3304806f-9172-4690-b9b7-fa672319eaef",
                "persona_id": "ca53ec58-a4e8-4330-a5c3-8dea2235b01f",
                "member_count": 5
            }
        }
    ]
},
  

Я хочу переместить поле member_count на один уровень выше, чтобы оно просто возвращалось как часть объекта Persona. Есть ли способ сделать это встроенным в Laravel?

Комментарии:

1. вы можете сделать это с помощью пользовательского запроса к БД. Я не думаю, что есть способ сделать это напрямую с помощью Eloquent

Ответ №1:

думаю, вы можете сделать addSelect внутри вашей нетерпеливой загрузки….

    $value = Community::where('id', 1)->with(['personas'=> function ($query) {
            $query->join('communities_personas', 'personas.id', 'communities_personas.personas_id')->
            addSelect(['communities_personas.member_count,communities_personas.personas_id']);
        }])->get();
  

я не уверен в названии ваших таблиц и моделей, пожалуйста, исправьте неправильные…

и убедитесь, что вы также добавляете выбор внешнего ключа между таблицей personas и сводной таблицей.