2016-07-27 68 views
0

我有一個Contact命名模式是這樣的:添加約束morphMany在多態性關係laravel

class Contact extends Model 
    { 
     public $timestamps = false; 
     protected $primaryKey = 'contact_id'; 

     protected $fillable = [ 
      'tel', 'fax', 'email', 'mob', 'address' 
     ]; 

     public function contactable() 
     { 
      return $this->morphTo(); 
     } 
    } 

以上模型可以屬於一個名爲典範House這樣一些其它型號:

class House extends Model 
    { 
     protected $primaryKey = 'house_id'; 

     public function contact() 
     { 
      return $this->morphMany('App\Contact', 'contactable'); 
     } 

    } 

每個House只能有一個相關的聯繫人但是由於Contact模型可能與其他模型有關,我必須定義多態關係。

現在,當我想要獲取相關的特定House模型的Contact模型時,返回一個Contact數組(僅有一個元素),而我想將其作爲一個簡單的對象模型。例如:

public function edit (\App\House $house) 
     { 

      $house = $house->load('contact'); 

      return $house; 

      return view('admin/pages/house/house-edit', compact('house')); 
     } 

結果是這樣的:

{ 
    "house_id": 6, 
    "title": "testا", 
    "header": "0f74e9aa891bcc6fb84aa744721d9692.jpg", 
    "type": "sara", 
    "creator": 1, 
    "created_at": "2016-07-26 15:19:31", 
    "updated_at": "2016-07-26 15:19:31", 

    "contact": [ 
     { 
      "contact_id": 1, 
      "tel": "1", 
      "fax": "2", 
      "email": "3", 
      "mob": null, 
      "contactable_id": 6, 
      "contactable_type": "App\\House" 
     } 
    ] 
} 

我試試先()方法來使用的關係:

public function contact() 
     { 
      return $this->morphMany('App\Contact', 'contactable')->first(); 
     } 

但是卻得到了這樣錯誤:

Call to undefined method Illuminate\Database\Query\Builder::addEagerConstraints()

什麼是解決方案?

回答

1

我一直在檢查,看看是否有人可以給一個答案,但因爲沒有一個是,我有一個非常大膽猜測這有工作的機會,一些:

public function contactRelation() 
{ 
    return $this->morphMany('App\Contact', 'contactable'); 
} 

public function contact() 
{ 
    $this->load('contactRelation'); 

    return $this->contactRelation->first(); 
} 

基本上我認爲是你無法在變形關係上調用第一個()方法,所以也許如果先變形然後嘗試首先調用可能的結果。

請注意,您不再需要在您的控制器中使用$house = $house->load('contact');,只需嘗試訪問如下關係:$house->contact();

+0

感謝@TheFallen,根據您的解決方案,我添加了一個名爲'getContactAttribute'的訪問,並能簡化到聯繫人的訪問添加到'模型$ appends'財產模型。現在,當我獲得House模型時,相關聯繫人模型會作爲一個簡單屬性附加到它。 –

+0

@AB.Developer很好,很高興它解決了:) – TheFallen

1

有一種方法可以解決這個問題,而無需創建兩個函數。

一個例子可以是:

// House.php 
public function contact() 
{ 

    return Contact 

     ::where('contactable_id', $this->id) 

     ->where('contactable_type', 'App\\House') 

     ->first(); 

} 

也許你將不得不改變一些名字。

希望這有助於:)

編輯

上述解決方案只能被稱爲像這樣:如果你想使用它的 '正常' 的方式

$house->contact()

$house->contact->first())您應該在鏈的末尾刪除->first()

0

您可以使用morphOne關係

public function contact() 
{ 
    return $this->morphOne('App\Contact', 'contactable'); 
}