2017-05-25 137 views
0

目前我有兩個表;用戶和員工在Laravel中執行連接查詢的更好方法

所有用戶都是員工但不是所有的員工都是用戶,

我有一個模型UsersEmployee,一個用戶的個人信息被拉到了各自員工記錄。

現在我想顯示所有用戶,我可以把它用User::all(); 做的,但我也想有自己的個人信息了。

目前我正在做一個DB::調用來加入我的用戶模型中的函數表。

有沒有更好的方法呢?

+0

是你的'Employee'和'User'模型雄辯嗎?如果是這樣,他們是否與一個雄辯關係有關? – Scopey

+0

我是新來laravel,是的,他們是雄辯的,但我還沒有建立一個雄辯的關係,請提出你的解決方案,真的很感激它 – Roi

回答

2

你可以做到這一點的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和單向數據庫往返的方式在一天結束時可能會更具性能。

+0

我得到錯誤,它尋找'user_employee_no'不存在,我的主鍵表只是'employee_no'。如何停止laravel從關係訪問中添加user_前綴 – Roi

+0

您可以告訴Laravel在關係中使用哪些外鍵和本地鍵(相應的第二個和第三個參數)'return $ this-> hasOne(Employee :: class,'employee_no '';''查看更新的答案 – peterm

+0

感謝先生的答案,並且對於加入的洞察力,我正在計劃將'user'表加入到'user_meta'表中,該表包含訪問限制,也將'employee'加入'employee_meta'其他可選信息 – Roi

1

您應該建立關係。在這種情況下,您的用戶可以與你的員工這樣

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']; 
} 
1

聽起來像是你需要使用一個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'); 
    } 
}