如何基于FK关系在DataMapper PHP构造函数中水合自定义属性

时间:2012-04-11 15:29:40

标签: php codeigniter codeigniter-datamapper

所以我有两个对象。

class Product extends DataMapper
{
    var $has_many = array('productrating');

    public $averageRating = null;

    function __construct($id = NULL)
    {
        parent::__construct($id);

        echo "my id: " . $this->id;
    }
}

class ProductRating extends DataMapper
{
    var $table = "product_ratings";
    var $has_one = array('product');

    function __construct($id = NULL)
    {
        parent::__construct($id);
    }
}

我最终想要实现的是填充Product->$averageRating属性,您猜对了,基于与ProductRatings的FK关系的平均评分。

我的第一个想法是访问关系,根据ProductRating行的数量进行数学运算并填充构造函数中的属性。但是我甚至在访问构造函数中的对象时遇到了问题。这让我相信我可能会以错误的方式解决这个问题。如何使用DataMapper实现这一目标?

我知道数学可以在View页面中完成,但如果可能的话,我真的希望将它保留在模型中。

1 个答案:

答案 0 :(得分:0)

理想情况下,我希望在构造函数中设置此属性,但很容易添加" getAverageRating"函数到Product类。访问此函数中的对象按预期工作。

public function getAverageRating()
{
    $ratings = array();
    foreach($this->productrating as $rating)
    {
        array_push($ratings, $rating->rating);
    }

    if(count($ratings) > 0)
    {
        return array_sum($ratings) / $this->productrating->count();
    }

    return null;
}