2017-07-20 89 views
0

我收到此錯誤信息,如果我嘗試在郵遞員跑我的帖子:Laravel BadMethodCallExeption查詢生成器發佈

BadMethodCallException

調用未定義的方法照亮\數據庫\查詢\生成器::文章()

我的路線是這樣的:

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

和控制器這樣的:

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

我得到一個輸出,但我想獲得後輸出。

+3

您是否定義了用戶與發佈模型之間的關係? –

回答

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

我更新了模型的問題,你介意看看?我有一個客戶表,其結構與用戶表相同。我仍然得到同樣的錯誤。 – Olipol

+0

我已經更新了我的答案。 –

0

我不知道你是如何定義Auth::client(),而是由一些代碼判斷存在的模型是如何被實例化一個誤解,什麼get()一樣。

get()返回一組結果。 Auth::user()已經返回一個用戶實例,當您調用Auth::user()->get()時,您正在向數據庫發送第二個查詢並返回一個用戶列表。 $user->posts()->get()有一個更傳統的/ memoized訪問數據集,`$用戶 - >職位的方式。

我建議檢查你的Auth::client()方法,並確保你不會無意中返回一個新的查詢。