如果我尝试在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();
我得到一个输出,但我想得到帖子输出。
答案 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()
方法,并确保不会意外返回新查询。