Laravel attach为belongsToMany关系返回undefined方法

时间:2017-09-28 11:48:45

标签: php laravel

我想创建一个有很多调查的问题。在问题模型:

public function surveys()
{
    return $this->belongsToMany(Survey::class, 'survey__surveyquestions');
}

保存新问题时在控制器中:

private $questions;

public function __construct(QuestionsRepository $questions)
{
    parent::__construct();

    $this->questions = $questions;
}

public function store(Request $request)
{
    $this->questions->create($request->all());

    $this->questions->surveys()->attach($request->surveys);

    return redirect()->route('admin.survey.questions.index')
        ->withSuccess(trans('core::core.messages.resource created', ['name' => trans('survey::questions.title.questions')]));
}

但是当它到达附加行时我得到以下错误:

  

(1/1)FatalErrorException调用未定义的方法   模块\测量\库\锋\ EloquentQuestionsRepository ::调查()

我注意到错误提到了EloquentQuestionsRepository,但我没有添加任何方法,所以它只是一个空类:

class EloquentQuestionsRepository extends EloquentBaseRepository implements QuestionsRepository
{
}

QuestionRepository:

interface QuestionsRepository extends BaseRepository
{
}

1 个答案:

答案 0 :(得分:3)

正如对主帖子的回复中所解释的那样 - 构造函数将QuestionsRepository解析为EloquentQuestionsRepository的实例,看起来它不是store方法所需要的。< / p>

我可能会做的是直接在模型上调用create方法并一起删除构造函数 - 除非你需要控制器中任何其他位置的QuestionsRepository实例:

public function store(Request $request)
{
    $question = Question::create($request->all());

    $question->surveys()->attach($request->surveys);

    ...

}

此外 - 我不确定传递$request->all()是最好的做法 - 我可能会使用$request->only(...)$request->all(...)指定您想要获得的项目来自请求,而不是将请求中的所有内容传递给create方法。

另一方面 - 你也可以使用Form Request,它会在将数据传递给store方法之前验证你的数据。

https://laravel.com/docs/5.5/validation#form-request-validation