我理解多态关系是如何工作的,但我仍然不明白如何才能得到表变形关联到各个表的结果。让我们举个例子来更好地理解。
我们有历史,订单和用户表的正常示例。
历史|表
id
historable_id
historable_type
event
订单|表
id
order
用户|表
id
fullname
然后让我们看看我们的多态关系:
历史模型
Class History extends Eloquent {
function historable() {
$this->morphTo();
}
}
用户模型
Class User extends Eloquent {
function history() {
$this->morphMany('History','historable');
}
}
订单型号
Class Order extends ELoquent {
function hisotry() {
$this->morphMany('History','historable');
}
}
现在,如果我想获得所有用户的历史记录,我可以做类似的事情
$user = User::find(1);
foreach ($user->historable as $history) {
echo "Name:".$user->fullname;
echo "Event:".$history->event;
}
我的问题是,如何在一次选择中同时获取用户和订单的历史,并自动将其与属于的数据相关联?
我期望结果的例子:
<h2>History</h2>
<table>
<tr>
<th>id</th>
<th>Category</th>
<th>Name</th>
<th>Event</th>
</tr>
<tr>
<td>1</td>
<td>Order</td>
<td>SmartPhone</td>
<td>Bought</td>
<tr>
<tr>
<td>2</td>
<td>User</td>
<td>Jhon Smith</td>
<td>Book SmartPhone</td>
</tr>
</table>
答案 0 :(得分:1)
您可以使用History
类作为普通的雄辩模型。 historable
模型上的History
关系将返回User
或Order
个实例。
对于您的预期结果,代码可能如下:
$histories = History::all();
foreach ($histories as $history) {
echo 'ID:' . $history->id;
echo 'Category:' . ($history->historable instanceof User) ? 'User' : 'Order';
echo 'Name:' . ($history->historable instanceof User) ? $history->historable->fullname : $history->historable->order ;
echo "Event:".$history->event;
}