目前我有兩個表;用戶和員工在Laravel中執行連接查詢的更好方法
所有用戶都是員工但不是所有的員工都是用戶,
我有一個模型Users
和Employee
,一個用戶的個人信息被拉到了各自員工記錄。
現在我想顯示所有用戶,我可以把它用User::all();
做的,但我也想有自己的個人信息了。
目前我正在做一個DB::
調用來加入我的用戶模型中的函數表。
有沒有更好的方法呢?
目前我有兩個表;用戶和員工在Laravel中執行連接查詢的更好方法
所有用戶都是員工但不是所有的員工都是用戶,
我有一個模型Users
和Employee
,一個用戶的個人信息被拉到了各自員工記錄。
現在我想顯示所有用戶,我可以把它用User::all();
做的,但我也想有自己的個人信息了。
目前我正在做一個DB::
調用來加入我的用戶模型中的函數表。
有沒有更好的方法呢?
你可以做到這一點的Laravel方式 - 渴望負載的關係
$users = User::with('employee')->get();
這是假設你有你的關係定義,至少在User
側。
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Employee;
class User extends Authenticatable
{
// ...
public function employee()
{
return $this->hasOne(Employee::class, 'employee_no');
}
}
僅供參考Laravel的方式並不一定意味着最快或最好的方式。儘管它通常在語法上更昂貴/簡潔和方便。
急於加載關係需要額外的查詢。在你的情況下,將在引擎蓋下執行兩個查詢,然後員工財產將在集合中的每個User
模型中實現。
因此,您在join
和單向數據庫往返的方式在一天結束時可能會更具性能。
我得到錯誤,它尋找'user_employee_no'不存在,我的主鍵表只是'employee_no'。如何停止laravel從關係訪問中添加user_前綴 – Roi
您可以告訴Laravel在關係中使用哪些外鍵和本地鍵(相應的第二個和第三個參數)'return $ this-> hasOne(Employee :: class,'employee_no '';''查看更新的答案 – peterm
感謝先生的答案,並且對於加入的洞察力,我正在計劃將'user'表加入到'user_meta'表中,該表包含訪問限制,也將'employee'加入'employee_meta'其他可選信息 – Roi
您應該建立關係。在這種情況下,您的用戶可以與你的員工這樣
public function employee()
{
return $this->hasOne(Employee::class);
}
隨着口若懸河,你可以定義你的User
模型來訪問關係,並用它做的方法。
public function role
{
return $this->employee->role;
}
但是,獲取用戶的時候,你要確保你「渴望負荷」你的員工關係,因此使用這些方法時,你不單獨獲取的僱員。當你獲取你的用戶:
User::with('employee')->all()
如果你總是需要員工記錄,你可以在默認情況下急於負載:
class User extends Authenticatable
{
protected $with = ['employee'];
}
聽起來像是你需要使用一個Eloquent One to One Relationship
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function employee()
{
return $this->hasOne('App\Employee');
}
}
是你的'Employee'和'User'模型雄辯嗎?如果是這樣,他們是否與一個雄辯關係有關? – Scopey
我是新來laravel,是的,他們是雄辯的,但我還沒有建立一個雄辯的關係,請提出你的解決方案,真的很感激它 – Roi