大家好,
我create了user , dept 兩個table
下面是兩個model:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Traits\HasRoles;
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
	//use AuthenticableTrait;
    //
	use HasRoles;
	use HasApiTokens; 
	
	public $table = "user";
	
	protected $keyType = 'string';
	
	public $timestamps = false;
	
	protected $fillable = [
		'id', 'email', 'name_en', 'name_tc',
		'name_zh', 'role_id', 'dept_id', 
		'shop_id', 'remember_token', 'created_at', 'updated_at'
	];
	
	protected $hidden = [
		'password', 'remember_token'
	];
	
	public function getNameEnAttribute($value)
    {
        return $value;
    }
	
	public function setNameEnAttribute($value)
    {
        $this->attributes['name_en'] = "username_en";
    }
	
	public function role()
    {
        return $this->hasOne('App\Roles', 'id');
    }
	
	public function shop()
    {
        return $this->hasOne('App\Shop', 'id');
    }
	
	public function dept()
    {
        return $this->hasOne('App\Dept', 'id', 'dept_id');
    }
	
	public function orderitem()
    {
        return $this->hasMany('App\OrderItem', 'id');
    }
	
	/* return $this->belongsToMany('App\role'); */
	
}
namespace App;
use Illuminate\Database\Eloquent\Model;
class Dept extends Model
{
    //
	protected $table = "dept";
	
	protected $fillable = [
		'id', 'name_en', 'name_tc', 'name_zh', 
		'created_at', 'updated_at'
	];
	
	public function user()
    {
		// set back many to one relationship with user model
        return $this->hasOne('App\Dept', 'user_dept_id', 'dept_id');
    }
	
	public function role()
    {
        return $this->hasMany('App\Item');
    }
}
不知道設定得有沒有錯
user 和 dept 的relationship 是 user hasone department, department hasMany user
但是當我用這句
User::with('dept')->where("id", Auth::user()->id)->get();
返回的json 是這樣...
{"status":"success","data":[{"id":"1","email":"admin@tuta.pos","name_en":"admin","name_tc":"\u7ba1\u7406\u54e1","name_zh":"\u7ba1\u7406\u54e1","role_id":"1","dept_id":"k02","shop_id":"1","created_at":"2020-07-14 07:23:58","updated_at":"2020-07-14 07:23:58","dept":null}]}
dept 出了null, 請問是我的user-dept 的關係錯嗎?
出了null代表沒關聯資料。
你得先確定你的 dept 表中的id有「k02」才行。
畢竟你的dept_id是=k02
你這段
public function dept()
    {
        return $this->hasOne('App\Dept', 'id', 'dept_id');
    }
是代表用user的dept_id去關聯你的dept表的id
且你在dept的model,反向user也錯了, 因該要如下才對
function user(){
        return $this->belongsTo('App\User', 'id', 'dept_id');
    }
謝謝你的幫忙, 但是我改了之後, 用這句call
return response()->json([ 'status' => 'success', 'data' => User::where('id', Auth::user()->id)->first()->dept ], 200);
只出了
{"status":"success","data":{"id":0,"name_en":"bartender","name_tc":"\u6c34\u5427","name_zh":"\u6c34\u5427"}}
沒有了user model 的data. 不知道為何?
你再加強一下吧。
你資料只取 dept 。當然就只有 dept 的資料啊。
其實你這邊有點搞混一個東西了。
你知道你的auth其實就是你的user表了嘛?
為何還要再多做一個搜尋uid幹嘛??
不覺得很多餘??
orm的觀念還需要再加強一下。不要將其當db操作。
它是一種容器的觀念。
先謝謝你的回答, 但我真的找了很久, 真的不知道這句怎寫才能
也拿到user
User::where('id', Auth::user()->id)->first()->dept
你知道你的auth其實就是你的user表了嘛?
為何還要再多做一個搜尋uid幹嘛??
不覺得很多餘??
這句我真的知道, 但我不知道怎樣可以用auth寫成Auth::user()->dept ??這樣
我只是想可以返回一個json
是 user 是 Auth::user()->id 而且dept_id 是k02
但是當我這樣寫 var_dump(Auth::user()->dept); die;
lluminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'dept.dept_id' in 'where clause' (SQL: select * from dept where dept.dept_id = 1 and dept.dept_id is not null limit 1) in file C:\wamptemppos1\www\resPos\vendor\laravel\framework\src\Illuminate\Database\Connection.php on line 664
因為dept_id 是user table 而不是dept, 那正確的是怎樣寫才能把user 和 所屬的dept_id同返回在一個json, 已經花了一天找, 好難...謝謝.
Auth::user()->dept->load('user')->toJson()
寫成這樣也不行
$userDb = Auth::with(['dept'])->user();
加油,我一開始玩orm也是這樣。搞懂之後就覺得很簡單了。
你現在還沒搞懂容器觀念。才會搞不懂。
BadMethodCallException
Method Illuminate\Auth\SessionGuard::with does not exist.
試過這樣寫
var_dump(User::with(['dept' => function ($query) {
$query->where('id', '=', Auth::user()->dept_id);
}])->get());  die;
也是出了
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'dept.dept_id' in 'where clause' (SQL: select * from dept where dept.dept_id in (1) and id = k02)

因為是user 的dept_id 對應 dept 的 id, 我在user table 已經幫dept_id 加了foreign key, 那dept 的id 也要加嗎?
你的user模組內至先要有
public function dept()
    {
        return $this->hasOne('App\Dept', 'id', 'dept_id');
    }
然後你先試試如下的用法
$userDb = Auth::user();
$userDb = $userDb->dept();
dd($userDb->toArray());
先自已查看你取到什麼值了。
這樣子說好了,你原本的做法及後面的做法,都是所謂的「自體循環」做法。
你的資料在你原本的容器都已經有了。
但你自已還用容器去請求一個新的容器資料。
這不是多此一舉嘛?
修改 User Model dept()
public function dept()
{
    // 先外鍵 再 主鍵
    return $this->hasOne('App\Dept', 'dept_id', 'id');
}
再使用
User::with('dept')->where("id", Auth::user()->id)->get();
但照理來說,主要功能是找出登入的帳號的資料,並包含 dept資料,User id 應該只有一位,請使用一下任一方法替代。
User::with('dept')->where("id", auth()->user()->id)->first();
User::with('dept')->find(auth()->user()->id);.
auth()->user()->load('dept');
還有很多寫法...
JSON 原本
{
    "status": "success",
    "data": [
        {
            "id": "1",
            "email": "admin@tuta.pos",
            "name_en": "admin",
            "name_tc": "\u7ba1\u7406\u54e1",
            "name_zh": "\u7ba1\u7406\u54e1",
            "role_id": "1",
            "dept_id": "k02",
            "shop_id": "1",
            "created_at": "2020-07-14 07:23:58",
            "updated_at": "2020-07-14 07:23:58",
            "dept": null
        }
    ]
}
建議這樣比較合理,不過還是看你的專案實際狀況。
{
    "status": "success",
    "data": {
        "id": "1",
        "email": "admin@tuta.pos",
        "name_en": "admin",
        "name_tc": "\u7ba1\u7406\u54e1",
        "name_zh": "\u7ba1\u7406\u54e1",
        "role_id": "1",
        "dept_id": "k02",
        "shop_id": "1",
        "created_at": "2020-07-14 07:23:58",
        "updated_at": "2020-07-14 07:23:58",
        "dept": null
    }
}
victor 你好,
我已經用了Auth::user()->load('dept')
但是在postman 出了這樣
Illuminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'dept.dept_id' in 'where clause' (SQL: select * from dept where dept.dept_id in (1)) in file C:\wamptemppos1\www\resPos\vendor\laravel\framework\src\Illuminate\Database\Connection.php on line 664
都是拿了dept, 而沒有了user....是怎樣寫, 找了好久, 好痛苦
Auth::user()->dept->load('user')->toJson()
寫成這樣也不行
你有修改這個嗎?
User Model 的 dept() 先外鍵 再 主鍵 如下所示
public function dept()
{
    return $this->hasOne('App\Dept', 'dept_id', 'id');
}