我有一个Detail
(代表订单明细)模型,我想要转换为销售订单明细或采购订单明细。所以我创建了一个具有'类型的表格。列,其价值为' sale'或者'购买'。
我的问题是,Laravel中有没有办法将Detail模型变形为Sale and Purchase,例如,如果我调用App\Sale::all()
它会获取App\Detail::all()->where('type','sale')
?
答案 0 :(得分:1)
您可以在此结构中设置数据库表:
purchases
id - integer
price - string
sales
id - integer
price - integer
details
id - integer
description - string
detailable_id - integer
detailable_type - string
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Detail extends Model
{
// Get all of the owning detailable models.
public function detailable()
{
return $this->morphTo();
}
}
class Sale extends Model
{
// Get all of the sales member's order details.
public function details()
{
return $this->morphMany('App\Detail', 'detailable');
}
}
class Purchase extends Model
{
// Get all of the purchase's order details.
public function details()
{
return $this->morphMany('App\Detail', 'detailable');
}
}
然后您可以检索这样的销售:
$sales = App\Sale::find(1);
foreach ($sales->details as $order_detail) {
//
}
购买相同:
$purchases = App\Purchase::find(1);
foreach ($purchases->details as $order_detail) {
//
}
有关多态关系的更多信息:http://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations
答案 1 :(得分:0)
虽然我还没有找到一种“官方”的方法来将一个类转换为另一个类。我开发了以下可能是解决方案的方法。
首先,定义扩展Sale
的两个模型Purchase
和Detail
,然后使用稍后定义的特征。
class Sale extends Detail { use SaleTrait; }
然后,使用GlobalScope向查询构建器添加约束。以下是步骤:
Sale
和Purchase
模型trait SaleTrait { public static function bootSaleTrait() { static::addGlobalScope(new ActiveEventsScope); } }
remove()
方法,所以我只需要在范围内定义apply()
。class SaleScope extends GlobalScope { public function apply(Builder $builder, Model $model) { $builder->where('type', 'sale'); } }
App\Sale::all()
和App\Purchase::all()
来检索我想要的内容。