有没有办法改变Laravel Eloquent模型?

时间:2015-08-10 19:00:59

标签: php laravel eloquent

我有一个Detail(代表订单明细)模型,我想要转换为销售订单明细或采购订单明细。所以我创建了一个具有'类型的表格。列,其价值为' sale'或者'购买'。

我的问题是,Laravel中有没有办法将Detail模型变形为Sale and Purchase,例如,如果我调用App\Sale::all()它会获取App\Detail::all()->where('type','sale')

2 个答案:

答案 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的两个模型PurchaseDetail,然后使用稍后定义的特征。


    class Sale extends Detail {
        use SaleTrait;
    }

然后,使用GlobalScope向查询构建器添加约束。以下是步骤:

  1. SalePurchase模型
  2. 定义特征
    
        trait SaleTrait {
            public static function bootSaleTrait()
            {
                static::addGlobalScope(new ActiveEventsScope);
            }
        }
    
    
    1. 然后定义范围。注意:这里不是实现ScopeInterface,而是扩展Sofa\GlobalScope为我处理remove()方法,所以我只需要在范围内定义apply()
    2. 
          class SaleScope extends GlobalScope
          {
              public function apply(Builder $builder, Model $model)
              {
                  $builder->where('type', 'sale');
              }
          }
      
      
      1. 现在我可以使用App\Sale::all()App\Purchase::all()来检索我想要的内容。