Laravel как использовать значение вместо полного объекта с объединением в красноречивой модели - PullRequest
0 голосов
/ 09 мая 2019

Когда я звоню красноречивым:

$user = User::where('idUser', 1)->with(['privilege'])->first()->toArray();

Это дает мне:

{
    "idUser": 1,
    "name": "UserName",
    "email": "UserName@gmail.com",
    "image": "https://image.com",
    "createdAt": "2019-05-07 15:43:47",
    "privilege": {
        "idPrivilege": 1,
        "name": "user"
    }
}

Когда я звоню Eloquent:

$user = User::where('idUser', 1)->with(['privilege:name'])->first()->toArray();

Элемент privilege в json установлен на null, но когда я звоню:

$user = User::where('idUser', 1)->with(['privilege:idPrivilege,name'])->first()->toArray();

Это так же, как первый звонок. Как я могу установить элемент privilege на е.е. user (я просто хочу простое значение вместо полного объекта Privilege)?

Я могу использовать что-то вроде:

$user['privilege'] = $user['privilege']['name']; 

Но этот не выглядит так хорошо!

Использование ресурса:

public function toArray($request)
    {
        return [
            'idUser' => $this->idUser,
            'name' => $this->name,
            'email' => $this->email,
            'privilege' => $this->privilege['name'],
            'createdAt' => $this->created_at,
        ];
    }

В контроллере:

$user = User::where('idUser', 1)->with('privilege')->first();
return UserResource::make($user);

Дает:

{
"data": {
"idUser": 1,
"name": "UserName",
"email": "UserName@gmail.com",
"privilege": "user",
"createdAt": "2019-05-07 15:43:47"
}
}

Как я могу просто вернуть объект вместо data {object}?

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Как указано в ответе HCK , вы можете использовать

$user = User
        ::where('idUser', $id)
        ->with(['privilege' => function($query) {
            return $query->select('name');
        }])
        ->first()
        ->toArray();

Чтобы получить то, что вам нужно. Теперь, если вы уже используете Ресурсы API и хотите удалить внешний объект data, вы можете добавить в свой метод AppServiceProvider boot следующее:

use Illuminate\Http\Resources\Json\Resource;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        Resource::withoutWrapping(); // With this, your resources won't have the
                                     // outter data wrapping

    }
}

Просто взгляните на документы !

0 голосов
/ 09 мая 2019

Попробуйте без бэкетов:

$user = User::where('idUser', $id)->with('privilege:name')->first()->toArray();

или вот это:

$user = User
        ::where('idUser', $id)
        ->with(['privilege' => function($query) {
            return $query->select('name');
        }])
        ->first()
        ->toArray();

Но тогда вы можете настроить ответ так, чтобы он возвращался к вашему виду, используя Ресурсы API .Благодаря этому вы можете использовать много разных ресурсов для одних и тех же элементов и форматировать ответ на любые ваши потребности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...