【问题标题】:Add attribute to eloquent model为 eloquent 模型添加属性
【发布时间】:2019-09-30 13:14:37
【问题描述】:

我想计算模型中某个属性的值,但无法得到我需要的数据。

class Product extends Model
{

    protected $appends = ['lowest_price'];

    public function shops(){
        return $this->belongsToMany('App\Shop')->withPivot('price','url');
    }

    public function type(){
        return $this->belongsTo('App\Type');
    }

    public function getLowestPriceAttribute()                      <-----------------------------
    {
        $lowest_price = 0;
        foreach($this->shops() as $shop) {
            if($lowest_price > $shop->pivot->price) {
                $lowest_price = $shop->pivot->price;
            }
        }
        return $lowest_price;
    }
}

$this-&gt;shops() 似乎没有加载我进行计算所需的所有数据。

在我看来,我可以像这样迭代产品的商店:

@foreach($shops as $shop)   
    <tr>
        <a href="{{ $shop->pivot->url }}" target="_blank">      
            <td>{{ $shop->name }}</td>
            <td>{{ $shop->pivot->price }}EUR</td>
        </a>        
    </tr>
@endforeach

如果这不可能,最好的选择是在视图本身而不是模型中进行计算?

【问题讨论】:

    标签: php laravel eloquent model


    【解决方案1】:

    您肯定可以在访问器函数中做到这一点。我认为您遇到的问题比您想象的要简单。

    $shops 在您看来可能是一个集合,但$this-&gt;shops() 返回一个查询生成器实例.. 所以尝试在函数中更改这一行:

    foreach($this->shops() as $shop) {
    

    有了这个:

    foreach($this->shops as $shop) {
    

    如果它有效,请告诉我。如果没有()shops 将是一个集合。

    【讨论】: