调用 Laravel 中未定义的函数 App\Http\Controllers\categories()

xtr*_*ODE 0 php laravel laravel-6

请我需要帮助,我正在 Laravel 中进行一个项目,当 T 尝试在多对多中使用数据透视表时遇到问题

在我的category model Category.php,我有下面的功能

public function users()
{
    return $this->belongsToMany(user::class);
}
Run Code Online (Sandbox Code Playgroud)

在我的user model User.php,我有下面的功能

public function authors()
{
    return $this->belongsToMany(author::class);
}
Run Code Online (Sandbox Code Playgroud)

web.php,我有这个

Route::post('/onboarding', 'OnboardsController@categoryUser');
Run Code Online (Sandbox Code Playgroud)

在 my 中onboarding view,我有一个表格:

   <form action="{{ url('/onboarding') }}" method="POST">
    @csrf
      @foreach($categories as $category)
        <div class="radio-item">
        <input class="form control" name="category_id" type="checkbox" id="category_id" required>
          <label for="name">{{ $category -> title }}</label>
        </div>
        @endforeach

        <div class="form-row">
          <div class="form-group col-md-12 text-center">
            <button type="submit">Proceed to Authors</button>
          </div>
        </div>
      </form>
Run Code Online (Sandbox Code Playgroud)

在我的 OnboardsController

我有这个

public function categoryUser (Request $request)
{
  $user = User::findOrFail(Auth::user()->id);
  $user = categories()->attach($request->input('category_id'));

  return redirect ( route ('onboarding_author')); 
}
Run Code Online (Sandbox Code Playgroud)

这是返回的错误:

调用未定义的函数 App\Http\Controllers\categories()

当我将控制器中的代码更改为

$category = Category::find($request->input('category_id'));
$user = User::where('user_id', Auth::id());
$category->users()->attach($user->id);
Run Code Online (Sandbox Code Playgroud)

这是返回的错误:

调用未定义的函数 App\Http\Controllers\users()

这是我的完整OnboardsController.php代码

<?php

namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Author;
use App\User;
use App\Category;


class OnboardsController extends Controller
{
public function index()
        {
    //
    return view('onboarding')
    ->with('categories', Category::all());

}

public function author()
{
//
return view('onboarding_author')
->with('authors', Author::all());

}

public function categoryUser (Request $request)
{

    dd(request('category_id'));
    Category::findOrFail(request('category_id'))
    ->users()
    ->attach(auth()->user()->id);

    return redirect ( route ('onboarding_author')); 
}
Run Code Online (Sandbox Code Playgroud)

请我是 Laravel 的新手,我已经用了 3 天了,我不知道如何解决这个问题。我需要帮助。

Ken*_*rna 5

你的问题就在这里:

$user = User::findOrFail( Auth::user()->id );
$user = categories()->attach($request->input('category_id'));
   ^^^^^^
Run Code Online (Sandbox Code Playgroud)

你正在调用一个方法 category() ......什么?无所事事。我假设您想categories()User.php模型中调用该方法。所以尝试像这样更新你的代码:

$user = User::findOrFail( Auth::user()->id );
$user->categories()->attach($request->input('category_id'));
   ^^^^^
Run Code Online (Sandbox Code Playgroud)

这样,您将关联两个对象。


旁注

正如我所提到的,我假设categories您的User模型中有该方法:

# User.php

public function categories()
{
    return $this->belongsToMany(Category::class);
}
Run Code Online (Sandbox Code Playgroud)

请记住,模型应该大写。

此外,您可以改进直接从 Auth 外观获取用户的代码

这个:

$user = User::findOrFail(Auth::user()->id);
Run Code Online (Sandbox Code Playgroud)

是等价物:

$user = Auth::user();
Run Code Online (Sandbox Code Playgroud)