【问题标题】:Laravel BadMethodCallExeption Query Builder postLaravel BadMethodCallExeption 查询生成器帖子
【发布时间】:2017-07-20 09:52:08
【问题描述】:

如果我尝试在邮递员上运行我的帖子,我会收到此错误消息:

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);
    }
}

还有我的 Post 模型:

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();

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

【问题讨论】:

  • 你定义了用户和帖子模型之间的关系吗?

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


【解决方案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()return 客户端模型实例。

dd(Auth::Client());

【讨论】:

  • 我用模型更新了我的问题,你介意看一下吗?我有一个客户表,结构与用户表相同。我仍然遇到同样的错误。
【解决方案2】:

我不确定您是如何定义 Auth::client() 的,但从一些代码来看,对模型的实例化方式以及 get() 的作用存在误解。

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

我建议检查您的 Auth::client() 方法并确保您不会意外返回新查询。

【讨论】:

    猜你喜欢
    • 2013-08-07
    • 2021-12-03
    • 2015-12-13
    • 2021-02-20
    • 2020-03-12
    • 2021-04-27
    • 2017-06-04
    • 2015-07-10
    • 1970-01-01
    相关资源
    最近更新 更多