2016-12-05 37 views
0

我有兩種模式:UserGroup。一個user可以只是一個group一員,和group可以有多個usersLaravel雄辯的關係數據隱藏在迴應中

用戶:

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class User extends Model 
{ 
    protected $table = 'user'; 
    protected $primaryKey = 'user_id'; 

    protected $fillable = []; 
    protected $visible = ['user_id', 'name', 'points', 'group_id', 'profile']; 


    /** 
    * Get group where user belongs to 
    */ 
    public function group() 
    { 
     return $this->belongsTo('App\Models\Group', 'group_id', 'group_id'); 
    } 
} 

組:

<?php 

namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 

class Group extends Model 
{ 
    protected $table = 'group'; 
    protected $primaryKey = 'group_id'; 

    protected $fillable = []; 
    protected $visible = ['group_id', 'name', 'profile']; 

    /** 
    * Get all group users. 
    */ 
    public function users() 
    { 
     return $this->hasMany('App\Models\User', 'group_id', 'group_id'); 
    } 
} 

現在在我的控制器,我想檢索用戶數據和用戶的組數據。所以我用這個:

$users = User::with('group') 
     ->orderBy('points', 'DESC') 
     ->take(50) 
     ->get(); 

return response()->json($users); 

到目前爲止好。我期望上述返回像這樣:

[ 
    { 
    "user_id": 27, 
    "name": "linnie15", 
    "points": 18565, 
    "group_id": 6, 
    "profile": null, 
    "group": { 
     "group_id": 6, 
     "name": "White Wall", 
     "profile": "Et tempore voluptatibus sunt ratione ut. Eum sint mollitia omnis eius ut facilis aut. Sed quisquam quis velit qui sint soluta. Autem quia ipsam esse sapiente delectus vel." 
    } 
    }, 
] 

但是,這裏是問題所在。它唯一返回的是:

[ 
    { 
    "user_id": 27, 
    "name": "linnie15", 
    "points": 18565, 
    "group_id": 6, 
    "profile": null 
    }, 
] 

這怎麼可能?實際上,我找到了解決辦法,在User模型中加入'group'$visible陣列。但爲什麼呢?我的意思是,我真的應該把所有的關係加到$visible陣列上嗎?爲什麼這是必要的。如果你查詢一段關係,你總是想要結果,不是嗎?

+0

的'$ visible'屬性顯式白名單可以顯示哪些數據。任何不在其中的東西都不會顯示。如果你想要默認顯示所有東西(包括relatinships),只隱藏某些東西,你應該定義一個'$ hidden'屬性。 – David

+0

如果你想更深入地控制你的JSON響應,請看分形(https://github.com/thephpleague/fractal) – Vuldo

回答

0

正如看到你的代碼,用戶和組之間的關係會被認爲是這樣的(你不應該給於的hasMany()relationsip的第三個參數):對方法

return $this->belongsTo('App\Model\Group', 'group_id'); 

同一案件users()組模型:

return $this->hasMany('App\Model\User'); 

laravel docs,該hasMany()需要:

return $this->hasMany('App\Model', 'foreign_key', 'local_key'); 

請記住,必須在$visible

See visibility docs from Laravel

希望這有助於增加所有屬性!

+0

我試過了,但對輸出來說並不重要。仍然一樣:組數據在json輸出中不可見.. – Jordy

+0

我更新了代碼,試用了它 –

0

是的,在你的情況下,你必須在visible數組中添加你所有的屬性。如果您不想這樣做,請使用$hidden而不是$visible,並在其中僅放入您不想在響應中顯示的屬性。

$fillable$guarded一樣,您只能使用其中的一個。


EXTRA

我想補充一點,沒有必要做return response()->json($users);。在Laravel 5.3中,您可以只需return $users;,並將自動返回爲json數組。

0

好吧,先生您在關係定義中存在問題。第三個參數應該是user_id。嘗試下面的代碼,讓我知道

/** * Get group where user belongs to */ 
public function group() { 
    return $this->belongsTo('App\Models\Group', 'group_id', 'user_id'); 
}