Laravel: использовать makeVisible () после вызова hasMany () - PullRequest
1 голос
/ 05 мая 2020

Я использую lumen для разработки REST API. Я использовал для этого 2 модели User и Post. В моей модели User я могу получить все сообщения пользователя, используя метод hasMany():

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
  // ...
  public function posts()
  {
    return $this->hasMany('App\Post');
  }
  // ...

Очень полезно получить все мои сообщения пользователя:

return response()->json(User::find($id)->posts, 200);

Проблема в что у модели Post есть некоторые скрытые атрибуты, которые не отображаются в ответе (что является нормальным поведением), но для некоторого запроса мне нужно их вернуть. Для этой цели laravel предоставляет метод под названием makeVisible () . Поэтому я решил использовать его в своем методе posts():

  public function posts()
  {
    return $this->hasMany('App\Post')->makeVisible(['hiddenAttribute', ...]);
  }

Но, к сожалению, все не так просто, и я получаю эту ошибку:

Call to undefined метод Illuminate \ Database \ Eloquent \ Relations \ HasMany :: makeVisible ()

Кто-нибудь знает, как я могу использовать оба этих метода вместе?

1 Ответ

1 голос
/ 06 мая 2020

вариант 1:

как porloscerros Ψ сказал в комментарии, вам нужно перебрать всю свою коллекцию моделей и сделать видимой

$value = User::find($id)->posts->each(function ($post, $key))
  {
    $post->makeVisible(['hiddenAttribute',...]);
  }
); 

return response()->json($value, 200);

вариант 2: расширить класс модели в соответствии с вашими потребностями ... см .: { ссылка }

...