无法访问关系Laravel HasManyThrough

时间:2016-11-28 16:00:33

标签: php laravel laravel-5 model

我有5个型号,2个是枢轴/中间模型。

TenantLandlordPropertyLandlordPropertyTenantProperty

房东&租户既需要从Property模型中访问,也可以独占访问。

目前,我无法从Property访问Landlord模型,它只返回没有数据。

表:

属性表:

------------------------
|       id|   propTitle|
------------------------
|        1|  Property 1|
------------------------
|        2|  Property 2|

楼主表:

------------------------
|       id|   firstName|
------------------------
|        1|         Bob|
------------------------
|        2|       Roger|

租户表:

------------------------
|       id|   firstName|
------------------------
|        1|         Ted|
------------------------
|        2|       Peter|

TenantProperty表:

-----------------------------------------------------------------
|       id|   tenant_id|   property_id|contractStart| contractEnd
-----------------------------------------------------------------
|        1|           1|             2|   01-01-1970|  01-01-1971
-----------------------------------------------------------------
|        2|           2|             1|   01-01-1970|  01-01-1971

LandlordProperty表:

-----------------------------------------------------------------
|       id| landlord_id|   property_id|contractStart| contractEnd
-----------------------------------------------------------------
|        1|           1|             1|   01-01-1970|  01-01-1970
-----------------------------------------------------------------
|        2|           2|             2|   01-01-1973|  01-01-1973

型号:

class Landlord extends TenantModel {
    public function properties(){
        return $this->hasManyThrough('App\Property', 'App\LandlordProperty',
            'property_id', 'id', 'id');
    }
}

class Tenant extends TenantModel {
    public function properties()
    {
        return $this->hasManyThrough(
            'App\Property', 'App\TenantProperty',
            'property_id', 'id', 'id');
    }
}

class Property extends TenantModel {
    public function landlords()
    {
        return $this->hasManyThrough(
            'App\Landlord', 'App\LandlordProperty',
             'landlord_id', 'id', 'landlord_id');
    }

    public function getLandlordAttribute()
    {
        return $this->landlords->first();
    }

    public function tenant()
    {
        return $this->hasManyThrough(
            'App\Tenant', 'App\TenantProperty',
             'tenant_id', 'id', 'property_id');
    }
}

class TenantProperty extends TenantModel {
    public function tenant() {
        return $this->belongsTo('App\Tenant');
    }

    public function property(){
        return $this->belongsTo('App\Property');
    }
}

class LandlordProperty extends TenantModel {
    public function property(){
        return $this->hasOne('App\Property');
    }

    public function landlord(){
        return $this->hasOne('App\Landlord');
    }
}

以下循环不返回$property->landlords上的数据,我不确定为什么

@foreach ($properties as $property)

    <tr class="clickable-row" data-href="/property/view/{{ $property->id }}">
        <td>{{ $property->id }}</td>
        <td>{{ $property->streetAddress }}</td>
        <td>{{ $property->type }}</td>
        <td>{{ $property->firstName }} {{ $property->lastName }}</td>
        @php

            echo '<pre>' . var_export($property->landlords, true) . '</pre>';
        @endphp
        <td>
        @php
            if($property->status == 1){
                echo "<b style='color: green;'>Active</b>";
            }else{
                echo "<b style='color: red;'>Disabled</b>";
            }
        @endphp
        </td>
        <td>{{ date('d M Y', strtotime($property->created_at)) }}</td>
    </tr>
@endforeach

*编辑1 *

好的,所以将App\Property landlords() function调整为:

public function landlords()
{
    return $this->hasManyThrough(
        'App\Landlord', 'App\LandlordProperty',
         'property_id', 'id', 'id');
}

现在开始返回一些数据,但它不一致。

它正在循环LandlordProperty表中的ID,而不是提取相关属性ID的数据。

  • 物业#1 - &gt; LandlordProperty#1 - &gt;房东#1
  • 物业#2 - &gt; LandlordProperty#2 - &gt;房东#2
  • 物业#11 - &gt; LandlordProperty#3 - &gt;房东#3

2 个答案:

答案 0 :(得分:0)

我认为你犯了错误,因为一般来说,一个地产只有一个地主但有很多租户。所以房东和财产有很多关系。

我建议你删除LandlordProperty表并在属性表中创建一个lanlord_id外键。现在创建公共函数如下:

在lanlord模型中:

public function properties()
{
  return $this->hasMany(Property::class)
}
属性模型中的

public function landlord()
{
  return $this->belongsTo(Landlord::class)
}

现在尝试查询。

答案 1 :(得分:0)

我已设法使用belongsToMany解决此问题,如下所示:

class Tenant extends TenantModel
{
    public function property()
    {
        return $this->belongsToMany('App\Property', 'tenant_property', 'property_id', 'tenant_id')->withPivot('isActive','contractStart','contractEnd', 'property_id');
    }
}

class Property extends TenantModel
{

    public function landlord()
    {
        return $this->belongsToMany('App\Landlord', 'landlord_property', 'property_id', 'landlord_id')->withPivot('isActive','date_from','date_to', 'property_id');
    }

    public function tenant()
    {
        return $this->belongsToMany('App\Tenant', 'tenant_property', 'property_id', 'tenant_id')->withPivot('isActive','contractStart','contractEnd', 'property_id','vacatedDate');
    }
}

class Landlord extends TenantlModel
{
    public function property(){
        return $this->belongsToMany('App\Property', 'landlord_property', 'landlord_id', 'property_id')->withPivot('isActive','date_from','date_to', 'property_id');
    }
}

这也摆脱了中间控制器的问题,因为我正在使用数据透视表