php - 用于连接多个表的 Laravel ORM

标签 php mysql laravel

我有 9 个表,它们都喜欢连接在一起,它们都具有 employee 表中的外键 employee_id。我怎样才能得到它的 ORM 分布。下面是连接所有函数的数据库函数。

$modelEmployee = \DB::table('employees')
                ->select('*')
                ->join('employee_finances', 'employees.id', '=', 'employee_finances.employee_id')
                ->join('employee_addresses', 'employees.id', '=', 'employee_addresses.employee_id')
                ->join('employee_jobs', 'employees.id', '=', 'employee_jobs.employee_id')
                ->join('employee_admins', 'employees.id', '=', 'employee_admins.employee_id')
                ->join('employee_personals', 'employees.id', '=', 'employee_personals.employee_id')
                ->join('employee_memberships', 'employees.id', '=', 'employee_memberships.employee_id')
                ->where('employees.id', $id)
                ->get();

最佳答案

第一步

首先,为你的员工表创建模型,并向其他表模型添加各种关系

employees 表的 Eloquent 模型

namespace App\Models;

class Employee extends \Illuminate\Database\Eloquent\Model {

public function employee_finances()
{
    return $this->hasMany(\App\Models\EmployeeFinance);
}

public function employee_addresses()
{
    return $this->hasMany(\App\Models\EmployeeAddress);
}

public function employee_jobs()
{
    return $this->hasMany(\App\Models\EmployeeJob);
}

public function employee_admins()
{
    return $this->hasMany(\App\Models\EmployeeAdmin);
}

public function employee_personals()
{
    return $this->hasMany(\App\Models\EmployeePersonal);
}

public function employee_memberships()
{
    return $this->hasMany(\App\Models\EmployeeMembership);
}

第二步

现在为其他连接表创建模型。以下是 employee_finances 表的示例。 (同理,创建其他模型)

namespace App\Models;
class EmployeeFinance extends \Illuminate\Database\Eloquent\Model {
  ...
}

第 3 步

然后对于您的查询,您可以使用查询构建器的 withwhereHas 函数来使用关系。这相当于问题中提到的查询的结果,但结果的结构会有所不同;

\App\Models\Employee::with('employee_finances','employee_addresses','employee_jobs','employee_admins','employee_personals','employee_memberships')
->whereId($employeeid)
->whereHas('employee_finances')
->whereHas('employee_addresses')
->whereHas('employee_jobs')
->whereHas('employee_admins')
->whereHas('employee_personals')
->whereHas('employee_memberships')
->get();

结果

原始结果对象

原始结果将是普通构建器对象的对象,您不能在其中触发可以在模型 级别定义的进一步关系操作。 原始结果也将是结果的平面数组,并且可能更少。这里的一个示例是 id 列值将替换为主要员工的表列 id。

[
    0 => [
        'id' => 1,
        'employee_name' => 'Employee',
        'employee_finance_content' => 'finance_content',
        'employee_personal_content' => 'personal_content',
        'employee_jobs_content' => 'employee_jobs',
        'employee_addresses_content' => 'employee_addresses',
        'employee_admins_content' => 'employee_admins',
    ]
    ....
]

使用模型的新结果

结果将是 Employee 模型的实例。最终结果将是一个关联数组,其中每个关系都是数组的索引,但结果将是相关模型的一个实例,例如,employee_finances 将是一个索引或代表一个列和其中包含的值将是 EmployeeFinance 的一个实例,您可以在其上进一步执行 ORM 级别的事件。

[
    0 => [
        'id' => 1,
        'employee_name' => 'Employee'
        'employee_finances' => [
           'id' => 2,
           'employee_id' => 1,
           'employee_finance_content' => 'finance_content'
        ],
        'employee_addresses' => [
           'id' => 10,
           'employee_id' => 1,
           'employee_address_content' => 'employee_address'
        ]
    ],
    .....
]

关于php - 用于连接多个表的 Laravel ORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43064193/

相关文章:

php - PHP:检查$ msg是否包含yt链接

php - 使用大量复选框更新数据库

PHP & MySQL - 基于点击和时间的热门链接

javascript - Laravel - 显示更多/更少按钮冲突

laravel - 如何在另一个成功的命令后在 Laravel 内核中运行命令

php - MySQL 显示可用时间?

php - 为每个数组项添加 href

mysql - 在事务中更改 MySQL 触发器

php - 使用 PHP 删除记录时出现问题。包括代码

php - 如果浏览器关闭 laravel,则自动注销