我有一个Contact
这样命名的模型:
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"
}
]
}
我尝试在关系上使用first()方法:
public function contact ()
{
return $this->morphMany('App\Contact', 'contactable')->first();
}
但是得到了这个错误:
调用未定义的方法 照亮\数据库\查询\生成器:: addEagerConstraints()
什么是解决方案?
答案 0 :(得分:1)
我一直在检查是否有人可以给出答案,但由于没有人,我非常猜测这有可能有效:
public function contactRelation()
{
return $this->morphMany('App\Contact', 'contactable');
}
public function contact()
{
$this->load('contactRelation');
return $this->contactRelation->first();
}
基本上我认为你不能在变形关系上调用 first()方法,所以也许你先修改变形然后尝试首先调用结果它可能有效
请注意,您的控制器中不再需要$house = $house->load('contact');
,只需尝试访问以下关系:$house->contact();
。
答案 1 :(得分: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()
。
答案 2 :(得分:0)
您可以使用 morphOne 关系
public function contact ()
{
return $this->morphOne('App\Contact', 'contactable');
}