首页 > 解决方案 > 如何在 laravel/octobercms 和 twig 中按 Id 显示星级?

问题描述

我有这个查询来显示评级,它工作正常

$ads = Advert::find(151);
$this['userAverageRating'] = $ads->ratings()->avg('rating');

在树枝上显示它我也有这个


    <div align="left" style="font-size: 12px;">
    {% if userAverageRating %}
        {% for i in range(1,5) %}
            {% if userAverageRating >=  max(0, i-0.25) %}
                <span style="color: orange" class="fa fa-star"></span>
            {% elseif (userAverageRating > (i-0.75)) %}
                <span style="color: orange" class="fa fa-star-half-o"></span>
            {% else %}
                <span style="color: orange" class="fa fa-star-o"></span>
            {% endif %}
        {% endfor %}
        <span><b>{{ userAverageRating|round(1, 'floor')  }}/5</b></span>
    {% else %}
        <span class="fa fa-star-o"></span>
        <span class="fa fa-star-o"></span>
        <span class="fa fa-star-o"></span>
        <span class="fa fa-star-o"></span>
        <span class="fa fa-star-o"></span>
        <span style="font-size: 12px"><b></b></span>
    {% endif %}
</div>

上面的 twig 标签在 twig foreach 中

{% for ad in ads %}
{{ ad.title }}
{{ ad.description }}
...
//the above twig tag here
{% endfor %}

我的主要问题是广告 ID“151”的评级显示在所有广告 foreach 结果中,而不仅仅是 ID 为 151 的广告。任何想法为什么会这样以及如何解决它

标签: laraveltwigoctobercms

解决方案


解决这个问题的两种方法,我认为第一种方法更优雅。需要注意的一些事情是我在猜测如何使用您的模型。所以你可能需要调整if ($ad->ratings()->first)我假设如果那里没有东西,它将返回 null 。第二种方法现在更接近您的逻辑,但您需要添加 id(或独特的东西),以便您可以使用 twig 来检查 .id 之类的 id {% if userAverageRating and ad.id == userAverageRating.id %}

1:Foreach 并修改每个广告的集合以平均评分。

$ads = Advert::all();
foreach ($ads as $ad) {
    if ($ad->ratings()->first) {
    $ad->averageRating = $ad->ratings()->avg('rating');
    } 
    else {
    $ad->averageRating = null;
    }
}
$this['ads'] = $ads;

//Twig Script

{% if ad.averageRating %}
    {% for i in range(1,5) %}
        {% if ad.averageRating >=  max(0, i-0.25) %}
            <span style="color: orange" class="fa fa-star"></span>
        {% elseif (ad.averageRating > (i-0.75)) %}
            <span style="color: orange" class="fa fa-star-half-o"></span>
        {% else %}
            <span style="color: orange" class="fa fa-star-o"></span>
        {% endif %}
    {% endfor %}
    <span><b>{{ ad.averageRating|round(1, 'floor')  }}/5</b></span>
{% else %}
    <span class="fa fa-star-o"></span>
    <span class="fa fa-star-o"></span>
    <span class="fa fa-star-o"></span>
    <span class="fa fa-star-o"></span>
    <span class="fa fa-star-o"></span>
    <span style="font-size: 12px"><b></b></span>
{% endif %}

2:收集带有广告 ID 的数组中的评级。

$ads = Advert::all();
$ratings = [];
foreach ($ads as $key => $ad) {
    if ($ad->ratings()->first) {
    $ratings[$key] = [ 'id' = $ad->id, 'rating' = $ad->ratings()->avg('rating') ];
    } 
    else {
    $ratings[$key] = null;
    }
}
$this['userAverageRating'] = $ratings;

//Twig Script

{% if userAverageRating and ad.id == userAverageRating.id %}
    {% for i in range(1,5) %}
        {% if userAverageRating >=  max(0, i-0.25) %}
            <span style="color: orange" class="fa fa-star"></span>
        {% elseif (userAverageRating > (i-0.75)) %}
            <span style="color: orange" class="fa fa-star-half-o"></span>
        {% else %}
            <span style="color: orange" class="fa fa-star-o"></span>
        {% endif %}
    {% endfor %}
    <span><b>{{ userAverageRating|round(1, 'floor')  }}/5</b></span>
{% else %}
    <span class="fa fa-star-o"></span>
    <span class="fa fa-star-o"></span>
    <span class="fa fa-star-o"></span>
    <span class="fa fa-star-o"></span>
    <span class="fa fa-star-o"></span>
    <span style="font-size: 12px"><b></b></span>
{% endif %}

推荐阅读