Пользовательский метод не работает в отношении HasMany - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь вызвать пользовательский метод из модели по отношению.

Модель пользователя :

class User extends Model
{
  public function files()
  {
    return $this->hasMany(Files::class, 'file_id', 'id');
  }

}

Модель файла :

class Files extends Model
{
  public function cover() 
  {
     dd('blah blah');
  }
}

В моем контроллере я сказал:

$user = User::find(1);
$user->files()->cover();

Но я получу эту ошибку:

Call to undefined method Illuminate\Database\Eloquent\Relations\HasMany::cover()

В чем проблема в моем коде?

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

По сути, вы вызываете свой метод cover() для коллекции. Вот почему это не работает.

Вы используете hasMany Отношения Laravel. И этот hasMany возвращает коллекцию связанных записей (предметов). И вы не можете вызвать какую-либо модель функции на этом напрямую.

Но если вы хотите вызвать функцию по этому вопросу. вам нужно сначала зациклить элементы, как показано в примере ниже: -

$user = User::find(1);
foreach($user->files() as $file) {
    $file->cover();
}

Выше код предоставит вам вывод. Попробуйте это.

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

Если вы хотите получить все обложки ваших файлов, вы можете сделать это:

$user = User::with('files.cover')->find(1);

$covers = $user->files->pluck('cover')->flatten();

Я хочу использовать этот метод, чтобы проверить и затем сохранить обложку. потому что мне нужно проверить обложку перед вставкой, я не смог использовать метод create, это будет псевдоним для создания. поэтому я не могу переписать метод создания?

Из этого вы можете сделать следующее:

foreach($user->files as $file){

    $cover = $file->cover()->firstOrCreate(['attribute' => $value]);

    // If you want to check if you just created the cover 
    if($cover->wasRecentlyCreated){
       // Do stuff
    }
}
...