gpt4 book ai didi

php - 在我的 Laravel 应用程序中,数据库关系名称及其最佳实践

转载 作者:行者123 更新时间:2023-11-29 12:32:01 24 4
gpt4 key购买 nike

我的 Laravel 应用程序中有一个数据库架构。在该架构中,有三个模型 - BossEmployeeReview

一个老板可以拥有许多员工。一个员工可以有多个老板(我们可以考虑以前工作的老板)。 员工可以评价他/她的老板老板无法审查任何人,因此只有员工可以审查

因此,存在这些关系 -

员工和老板是多对多关系

员工与审核是一对多的关系(一名员工可以审核多个老板,从而获得来自他/她的多个审核)。

如您所见,BossReview 之间没有直接关系。 但是,查询是 -

Boss 'x' 的评价如何?

为了在 Laravel 中回答这个查询,我首先想到它具有“hasManyThrough”关系但是,“hasManyThrough”仅在 Boss 和 Employee 具有“一对多”关系时才有效。也就是说,一个 Boss 可以拥有多个 Employee,但反之则不然。

所以,我的问题是 - 是否存在适用于这种情况的关系(如多态等)?如果是的话,如何在laravel中使用它?

最佳答案

不需要额外的带有评论的表格。

这就是您所需要的一切 - 首先是表格:

bosses: id, ...
employees: id, ...
boss_employee: id, boss_id, employee_id, review (nullable), ...

然后是模型:

// Boss model
public function employees()
{
return $this->belongsToMany('Employee')->withPivot('review');
}

public function reviews()
{
return $this->hasMany('Review');
}

// Employee model
public function bosses()
{
return $this->belongsToMany('Boss')->withPivot('review');
}

public function reviews()
{
return $this->hasMany('Review');
}

// Review model
protected $table = 'boss_employee';

public function boss() // or eg. reviewed
{
return $this->belongsTo('Boss');
}

public function employee() // or eg. reviewer
{
return $this->belongsTo('Employee');
}

现在,通过此设置,您可以执行以下操作:

// get boss and his review
$boss = $employee->bosses->first();
$review = $boss->pivot->review;

// get review for given boss of an employee
$review = $employee->reviews()->where('boss_id', $bossId)->first();

// get bosses with reviews
$bosses = Boss::whereHas('reviews', function ($q) {
$q->whereNotNull('review');
})->get();

// and so on and so forth

您可以通过添加全局范围来增强您的 Review 模型,以便它仅返回 boss_employee 表中具有 not null review 字段的行。这与 SoftDeletingScope 几乎相同,但需要交换条件 - 默认情况下为 SoftDeletingScope 中的 whereNotNull,而不是 whereNull

关于php - 在我的 Laravel 应用程序中,数据库关系名称及其最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27345695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com