首页 > 解决方案 > 在 Laravel 关系查询中调用未定义函数

问题描述

由于我将有许多搜索过滤器,因此我将按照如下所示的方式构建它们。我已经展示了一个过滤器(用于帖子),因为那是一个引发错误的过滤器。

用户模型

public function posts()
{
    return $this->morphToMany('App\Post', 'postable');
}

用户控制器

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\User;

class UserController extends Controller
{

    public function searchPage(Request $request, User $user)
    {

        $user = $user->newQuery();

        if ($request->has('post'))
            $user->posts()->where('id', $request->input('post'));

        return $user->get();

    }

}

我明白了:虽然我认为根据文档Call to undefined method Illuminate\Database\Eloquent\Builder::posts()应该这样做。

标签: phplaravel

解决方案


newQuery()将返回查询生成器的一个实例。你不能在此之上建立关系。

public function searchPage(Request $request, User $user)
{
    // newQuery returns an instance of Query Builder
    // You can't chain relationships on the Query Builder
    $user = $user->newQuery();

    // You want an instance of the User model here. 
    // This is just an example
    $user = \App\User::find($request->id); 

    // If you are already passing in the user model
    // you can just use it as it is. No need to do 

    if ($request->has('post')) {
        $user->posts()->where('id', $request->input('post'));
    }

    return $user->get();
}

推荐阅读