首页 > 解决方案 > 如果包含在列 ID

问题描述

如果一列包含多个 ID,我如何连接两个表。

小故事,我有分公司,我的分公司有很多员工和经理。我有表分支,列经理和员工在哪里。

我必须向我的每个经理展示他的分支机构。

分支表

ID 姓名 业务_ID 经理人 雇员 地位
1 美丽 15 4,5,9,17 44,76,54,72 1

因此,如果我是经理并且我的 id 是 5,我应该会看到这个“美女”行。


表 > 分支

ID 姓名 地址 为谁 描述 图标 开始时间 时间结束 业务编号 is_featured 地位
1 美容OY 纽约大道 6 1 小说明.. 45hjds.png 09:00:00 19:00:00 15 1 1

表 > 分支类别

branch_id 类别ID
1 1

表 > 分支管理器

branch_id 用户身份
1 4
1 5
1 9
1 17

表 > branch_employees

branch_id 用户身份
1 44
1 76
1 54
1 72

模型 > 分支.php

public $table = 'branch';

protected $dates = [
    'created_at',
    'updated_at',
    'deleted_at',
];
protected $guarded = [];

protected $withCount = ['reviews'];
protected $appends = ['imageUri', 'avg_rating'];
public function getImageUriAttribute()
{
    if (isset($this->attributes['icon'])) {

        return url('upload/') . '/' . $this->attributes['icon'];
    }
}
public function managers(){
  return $this->belongsToMany(Branch::class);
}

public function employees(){
  return $this->belongsToMany(Branch::class);
}

public function getAvgRatingAttribute()
{

    $revData = Review::where('branch_id', $this->attributes['id'])->get();
    $star = $revData->sum('star');
    if ($star > 1) {
        $t = $star / count($revData);
        return number_format($t, 1, '.', '');
    }
    return 0;
}

public function Reviews()
{
    return $this->hasMany('App\Review', 'branch_id', 'id')->orderBy('created_at', 'desc');
}

所以我又为分公司员工和分公司经理创建了两个模型。但我已经有了现有的 EmployeeInfo 模型和控制器。我不知道这样做是否正确。

模型 > BranchEmployee.php

class BranchEmployee extends Model
{

    use SoftDeletes;

    public $table = 'branch_employees';
    protected $guarded = [];

   
    public function branches(){
      return $this->belongsToMany(BranchEmployee::class);
    }
}

和employeeInfo 模型如下所示:

模型 > EmployeeInfo.php

class EmployeeInfo extends Model
{

    public $table = 'employee_detail';

    protected $dates = [
        'created_at',
        'updated_at',

    ];

    protected $fillable = [
        'emp_id', 'address', 'description', 'service', 'icon', 'experience', 'status',
    ];

    protected $appends = ['imageUri', 'avg_rating'];
    public function setServiceAttribute($value)
    {
        $this->attributes['service'] = implode(',', $value);
    }

    public function getServiceAttribute($value)
    {
        return explode(',', $value);
    }
    public function getImageUriAttribute()
    {
        if (isset($this->attributes['icon'])) {

            return url('upload/') . '/' . $this->attributes['icon'];
        }
    }
    public function User()
    {
        return $this->belongsTo('App\User', 'emp_id', 'id');
    }
    public function getAvgRatingAttribute()
    {
        return 4;
        $revData = Review::where('provider_id', $this->attributes['id'])->get();
        $star = $revData->sum('star');

        if ($star > 1) {
            $t = $star / count($revData);

            return number_format($t, 1, '.', '');
        }
        return 'N/A';
    }

}

模型 > BranchManager.php

class BranchManager extends Model
{

    use SoftDeletes;

    public $table = 'branch_managers';
    protected $guarded = [];

   
    public function branches(){
      return $this->belongsToMany(Manager::class);
    }
}

首先,我创建了管理面板,可以轻松查询数据库中的所有数据。因为管理员可以通过 Gate 访问查看所有数据并限制数据。但是现在更难为业务类型的用户(所有者、经理、员工)创建查询。我想我已经错误地完成了与表格的整个关系,现在我正在努力解决这个问题。

业务分支控制器,我尝试仅为拥有分支机构并已分配给分支机构的业务所有者和经理查询数据。

控制器 > BranchController.php

public function index()
{

    if (!Gate::denies('branch_access')) {

        $branch = DB::table('branch')
            ->join('business', 'branch.business_id', '=', 'business.id')
            ->select('branch.id', 'branch.name', 'branch.address', 'branch.for_who', 'branch.start_time', 'branch.end_time', 'branch.icon', 'branch.is_featured', 'branch.status')
            ->where('business.owner_id', Auth::id())
            ->get();
    } elseif (!Gate::denies('branch_manager_access')) {
        $branch = DB::table('branch')
            ->join('business', 'branch.business_id', '=', 'business.id')
            ->join('branch_managers', 'branch.id', '=', 'branch_id')
            ->select('branch.id', 'branch.name', 'branch.address', 'branch.for_who', 'branch.start_time', 'branch.end_time', 'branch.icon', 'branch.is_featured', 'branch.status')
            ->where('branch_managers.user_id', Auth::id())
            ->get();
    } else {

        abort_if(true, Response::HTTP_FORBIDDEN, '403 Forbidden');
    }

    return view('salon.branch.index', compact('branch'));
}

管理员 - 控制器 > BranchController.php

public function index()
{

    if (!Gate::denies('branch_access')) {
        $branch = branch::all();
    } else {

        abort_if(true, Response::HTTP_FORBIDDEN, '403 Forbidden');
    }

    return view('admin.branch.index', compact('branch'));
}

我的 SaaS 项目 > 我想要做的是admin可以在他的面板中查看所有信息等......并且业务面板Owner可以看到他的所有分支并且Manager只能看到所有分配的分支。

我也想从头开始,用好的片段重新开始。我检查了其他人的存储库。但是每个 saas 都是不同的方式,而且更令人困惑。多租户是第一个想法,但我不需要子域系统,只需要管理员和供应商(企业)和最终用户(购买供应商服务/商品的用户)的面板。

标签: phplaraveleloquent

解决方案


好吧,你这样做很糟糕。每个分支机构可能有很多员工,每个员工可能有很多分支机构。所以,你应该创建第三个表,它可能被命名为employee_branch。并创建多对多关系。如果你使用的是 laravel。另一种选择是,您可以将驱动程序从 mysql 更改为支持数组的 postgres。但是最好的选择就是创建一个多对多的关系。如果您想知道如何,请在此处发表评论

正如我从你的桌子上得到的那样,你有 2 个多对多关系。第一个是分公司和经理,第二个是分公司和员工。这就是想法。准备多对多关系时,需要第三个表,名为 branch_manager。因为一个分支属于多个经理,一个经理属于多个分支。在第三个表中,我们有 branch_id 和 manager_id。所以这两者可以简单地相互连接。之后,您可以通过以下方式简单地获取经理的分支机构:

$branches = Manager::find($id)->branches;
$managers = Branch::find($branchID)->managers;

对于分支模型,您必须创建此函数:

public function managers(){
  return $this->belongsToMany(Branch::class);
}

对于经理模型:

public function branches(){
  return $this->belongsToMany(Manager::class);
}

我认为 laravel 会自动生成我告诉你的第三张表。对于员工,您应该只在分支机构和员工之间执行多对多。


推荐阅读