代码之家  ›  专栏  ›  技术社区  ›  user805528

Laravel 5-同一个表之间的多个关系。命名和语法

  •  0
  • user805528  · 技术社区  · 6 年前

    我有两张表(用户和公司)。用户具有不同的角色(购物者、分发者、管理员…)。我为购物者和分销商提供了一个有效的解决方案。我在为分销商用户设置第二个关系时遇到问题。在用户表中,我为购物者提供了公司ID密钥。在公司表中,我有分销商的主分销商ID密钥

    关系:一个公司可以有多个购物者用户。一个购物者用户可以被指定为一个公司。

    一个公司可以有一个经销商。一个分销商可以指定给多个公司。

    用户模型:

    /* used for shoppers */
    public function company() {
            return $this->belongsTo(Company::class);
    }
    
    /* what is the proper naming? */
    public function mainDistributorCompanies() {
            return $this->belongsTo('App\Company','main_distributor_id','id');
    }
    

    公司模式:

    /* for shopper users.. */
    public function users() {
            return $this->hasMany(User::class, 'company_id');
    }
    
    /* What is the proper naming */
    public function mainDistributorUsers() {
            return $this->hasOne('App\User','id','main_distributor_id');
    }
    

    公司负责人:

    public function index(Request $request) {
    
    /* is this the correct way to include the relationship? Naming? */
    $companies = Company::with('mainDistributorUsers')->get();
    return view('companies/index', compact('companies'));
    }
    

    公司索引视图:

    @foreach($companies as $company)
        <tr>
            <td>{{ $company->index }}</td>
            <td>{{ $company->name }}</td>
            <td>{{ $company->address }}</td>
    
            <td>{{ $company->mainDistributorUsers->username }}</td> // error
            <td>{{ $company->mainDistributorUsers()->username }}</td> // error
            <td>{{ $company->username }}</td> // empty
        </tr>
    @endforeach
    

    我是否为经销商选择了错误的关系?错误命名?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jonas Staudenmeir    6 年前

    你必须检查没有 mainDistributorUsers :

    @isset($company->mainDistributorUsers)
        {{ $company->mainDistributorUsers->username }}
    @endisset
    

    或使用 optional() 帮手:

    {{ optional($company->mainDistributorUsers)->username }}
    

    顺便说一句: mainDistributorUsers() 应该是 BelongsTo 关系:

    public function mainDistributorUsers() {
        return $this->belongsTo('App\User', 'main_distributor_id');
    }