Laravel BadMethodCallExeption查询生成器帖子

时间:2017-07-20 09:52:08

标签: php laravel laravel-5.4 laravel-query-builder

如果我尝试在postman上发布我的帖子,我会收到此错误消息:

  

BadMethodCallException

     

调用未定义的方法Illuminate \ Database \ Query \ Builder :: posts()

我的路线看起来像这样:

Route::middleware('auth:api')->group(function ()
{
     Route::get('posts', ['as' => 'posts', 'uses' => 'Api\PostController@index']);
}

控制器就像这样:

class PostController extends Controller
{
    public function index()
    {
        $posts = Auth::client()->posts()->get();
        dd($posts);
        return response()->json(['data' => $posts], 200, [], JSON_NUMERIC_CHECK);
    }
}

我的客户端型号:

class Client extends Model implements AuthenticatableContract,
                                      AuthorizableContract,
                                      CanResetPasswordContract
{
    use Authenticatable, Authorizable, CanResetPassword, HasApiTokens, Notifiable;

    protected $table = 'clients';

    protected $fillable = ['name', 'email', 'password'];
    protected $hidden = ['password', 'remember_token'];


    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

我的帖子模型:

namespace App;

use App\Client;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function client()
    {
        return $this->belongsTo(Client::class);
    }
}

如果我转储这个:$posts = Auth::user()->get();

我得到一个输出,但我想得到帖子输出。

2 个答案:

答案 0 :(得分:1)

您应首先定义关系。

<?php

...
class User extends Model
{
    public function posts()
    {
        return $this->hasMany('App\Post');
    }
}

一旦定义,您可以通过访问posts属性来访问帖子集合。最重要的是,您应首先检索一行,然后访问这样的帖子集合:

$client = Client::find(1);
$posts = $client->posts;

或者你可以像这样的查询构建器提供关系:

$posts = App\Client::find(1)->posts()->where('name', 'tests')->get();

如果仍然出现错误,您应该检查Auth::client()是否返回客户端模型实例。

dd(Auth::Client());

答案 1 :(得分:0)

我不确定你是如何定义Invoices.serviceID = Invoices.serviceID 的,但是根据一些代码来判断模型是如何被实例化的,以及Auth::client()做了什么。

get()返回结果集合。 get()已经返回用户实例,当您调用Auth::user()时,您正在向数据库发送第二个查询并返回用户列表。 Auth::user()->get()有一种更传统/记忆的访问数据集的方式,`$ user-&gt;帖子。

我建议您查看$user->posts()->get()方法,并确保不会意外返回新查询。