Laravel-4 Polymorphic Relationship显示两种类型的表格

时间:2013-12-21 13:02:14

标签: php orm laravel-4 eloquent polymorphic-associations

我理解多态关系是如何工作的,但我仍然不明白如何才能得到表变形关联到各个表的结果。让我们举个例子来更好地理解。

我们有历史,订单和用户表的正常示例。

历史|表

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>

1 个答案:

答案 0 :(得分:1)

您可以使用History类作为普通的雄辩模型。 historable模型上的History关系将返回UserOrder个实例。

对于您的预期结果,代码可能如下:

$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;
}