自定义数据透视表中的雄辩关系

时间:2015-03-19 12:26:12

标签: laravel laravel-5

我可能会过于复杂化,但这里的关系我试图用Eloquent(Laravel 5)写作:

我有一份产品清单和价目表。每种产品都有很多价格表。这很容易做到,但这是另一回事 - 对于每个产品<>价格表分配我可以根据数量定价很多,所以它就像:

productID: 1010
priceListId: 1

min quantity: 1 -> price 10.00
min quantity: 5 -> price 9.50
min quantity: 10 -> price 9.00

productID: 1010
priceListId: 2

min quantity: 1 -> price 15.00
min quantity: 40 -> price 14.00
min quantity: 90 -> price 12.00

我想我知道如何创建自定义数据透视表,虽然我不知道如何使用它。我跟着this link,现在我不确定我的代码是否正确以及如何使用它。

目前我有:

产品型号:

class Product extends Model {

    public function pricelists()
    {
        return $this->belongsToMany('PriceList');
    }

    public function newPivot(Model $parent, array $attributes, $table, $exists)
    {
        if ($parent instanceof PriceList)
        {
            return new ProductPricePivot($parent, $attributes, $table, $exists);
        }

        return parent::newPivot($parent, $attributes, $table, $exists);
    }

}

PriceList型号:

class PriceList extends Model {

    public function products()
    {
        return $this->belongsToMany('Product');
    }

    public function newPivot(Model $parent, array $attributes, $table, $exists)
    {
        if ($parent instanceof Product)
        {
            return new ProductPricePivot($parent, $attributes, $table, $exists);
        }

        return parent::newPivot($parent, $attributes, $table, $exists);
    }
}

支点:

class ProductPricePivot extends Pivot {

    public function product()
    {
        return $this->belongsTo('Product');
    }

    public function pricelist()
    {
        return $this->belongsTo('PriceList');
    }

    public function prices()
    {
        return $this->hasMany('ProductPrice');
    }

}

现在,ProductPrice再次扩展了Model,它只是一个标准模型而没有任何其他方法。

这是对的吗?如果是这样,那么请按照上面的示例,如何在产品1010上的价格表1中添加新的数量/价格水平?

目前,在创建关系时,我正在做:

$productID = 1010;
$priceListID = 1;

$priceList = PriceList::find($priceListID);
$priceList->products()->attach($productID);

$productToPriceList = $priceList->products()->find($productID);

我迷失在这里......我找到了这种关系,但我现在如何附加下一个数量<>价格水平呢?

有人可以举例说明如何使用这种关系或链接到我可以找到更多相关信息的页面吗?是的,我检查了Laravel文档,是的,我也搜索了它。

谢谢!

1 个答案:

答案 0 :(得分:2)

正如您所描述的那样,我在这里看到两种类型的关系:

    {li> Product&之间的多对多关系PriceList {li> PriceList与...之间的多对一关系ProductPrice(包含“最小数量”和“价格”)值。

    我假设您不需要许多“价格表”的相同价格条件。每个清单都有它的价格条件。

    多对一关系不需要数据透视表。

    关注this link,您会发现laravel Eloquent系统对您有很大帮助。

    您需要4个表:产品,price_lists,product_prices,products_to_pricelists(支点)

    products_to_pricelists表看起来像这样:

    *====*============*===============*
    | id | product_id | price_list_id |
    *====*============*===============*
    

    现在模特:

    产品:

    class Product extends Eloquent {
    
        protected $table = 'products';
    
        public function price_lists()
        {
            return $this->belongsToMany('PriceList', 'products_to_pricelists', 'price_list_id');
        }
    
    }
    

    价目表:

    class PriceList extends Eloquent {
    
        protected $table = 'price_lists';
    
        public function prices()
        {
            return $this->hasMany('ProductPrice');
        }
    
    }
    

    价格:

    class ProductPrice extends Eloquent {
    
        protected $table = 'product_prices';
    
    }
    

    现在很容易:

    $productID = 1010;
    $list_id = 1;
    $theProduct = Product::find( $productID );
    $theProductPriceLists = $theProduct->price_lists; // Don't use parens
    $theList = Product::find( $productID )->price_lists()->where('price_lists.id', $list_id)->first(); // Here you use parens
    $theListPrices = $theList->prices; // Again no parens
    

    Laravel只为您管理枢轴连接!

    希望有帮助