在Laravel中执行连接查询的更好方法

时间:2017-05-25 03:23:47

标签: php mysql laravel-5

目前我有两张桌子;用户和员工

所有用户都是员工,但并非所有员工都是用户,

我有一个模型UsersEmployee用户的个人详细信息会被拉出他们各自的员工记录。

现在我想显示所有用户,我可以使用User::all();来完成 但我也希望得到他们的个人资料。

目前,我正在DB::调用我的用户模型中的函数中的表。

有更好的方法吗?

3 个答案:

答案 0 :(得分: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模型实现employee属性。

因此,使用join和数据库往返一次的方式在一天结束时可能会更高效。

答案 1 :(得分:1)

你应该建立一种关系。在这种情况下,您的用户可以与您的员工建立联系

public function employee()
{
    return $this->hasOne(Employee::class);
}

使用Eloquent,您可以在User模型中定义方法来访问关系并完成它。

public function role
{
    return $this->employee->role;
}

但是,在提取用户时,您需要确保“急切加载”#34;您的员工关系,以便您在使用这些方法时不会单独提取员工。当您提取用户时:

User::with('employee')->all()

如果您始终需要员工记录,则默认情况下您可以急切加载:

class User extends Authenticatable
{
    protected $with = ['employee'];
}

答案 2 :(得分: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');
    }
}