Как вызвать функцию в одном контроллере на другой контроллер в laravel

#laravel-5

#laravel-5

Вопрос:

Я хочу вызвать функцию в другом контроллере. когда я вызываю это, выдает ошибку.

Вызов неопределенного метода IlluminateDatabaseQuery Builder::defaultBuckets()

Я не знаю, почему это выдает мне эту ошибку. Я не уверен, что правильно вызываю эту функцию на другом контроллере. Вот мой код. Пожалуйста, помогите.

Вот моя функция, которую я создал в своем BucketController:

 public function defaultBuckets()
{
    $buckets = Bucket::where('bucket_type', 'default')->get();
}
  

И вот моя функция контроллера профиля, где я вызываю эту функцию:

 public function show(User $user)
{
    $authUser = JWTAuth::parseToken()->toUser();

    if (! $user->isBlocking($authUser) amp;amp; ! $user->isBlockedBy($authUser)) {
        if($authUser->id == $user->id){

           $profile = $user->where('id', $user->id)->defaultBuckets()->with([
            'posts', 'likes', 'followers', 'following'])->first(); 
        } else{

        $profile = $user->where('id', $user->id)->with([
            'posts' => function ($query) {
                $query->where('post_type', 'public');
            },
            'buckets' => function ($query) {
                $query->where('bucket_type', 'public');
            },
            'likes' => function ($query) {
                $query->where('post_type', 'public');
            },
            'followers', 'following'])->first();
        }
    return response()->json(['profile'=> $profile], 200);
    }

    return response()->json(['message'=> 'Your are not able to open profile of this user'], 200);
} 
  

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

1. Вы вызываете функцию для Builder объекта, возвращаемого $user->where('id', $user->id) . вы не вызываете ее на контроллере

2. Итак, как я могу сделать?

3. Что должна делать функция? ваша функция просто заполняет переменную, но ничего с ней не делает

4. Я хочу показать сегменты по умолчанию, которые я получаю от этой функции в профиле, вот почему я называю это @mi

5. Вам нужно создать экземпляр вашего контроллера $bucketController = new BucketController(); , а затем $bucketController->defaultBuckets();

Ответ №1:

Я думаю, что это ошибка. Вы сказали, что у вас есть эта функция в вашем BucketController

 public function defaultBuckets()
{
  $buckets = Bucket::where('bucket_type', 'default')->get();
}
  

и затем вы запускаете функцию из user model в вашем ProfileController

 $profile = $user->where('id', $user->id)->defaultBuckets()->with([
        'posts', 'likes', 'followers', 'following'])->first(); 
  

Именно по этой причине в нем говорится, что не существует функции с именем «defaultBuckets».

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

Также не забудьте вернуть ведра следующим образом:

Чтобы вернуть все ведра

 public function defaultBuckets()
{
  $buckets = Bucket::where('bucket_type', 'default')->get();
  return $buckets; // all buckets
}
  

Для возврата только пользовательских корзин

 public function defaultBuckets()
{
  return $this->hasMany(Bucket::class)->where('bucket_type', 'default');
}
  

Убедитесь, что вы приняли связь от пользователя в модели корзины следующим образом:

 public function user(){
 return $this->hasOne(User::class, 'bucket_id' , 'user_id');
}
  

Вы можете заменить имена столбцов (bucket_id,user_id) в соответствии с вашей базой данных.

Дайте мне знать, если это устранит вашу проблему