jeudi 2 février 2017

How to assign a dynamic property in a model via a SQL query in Laravel 5

I'm using Laravel 5.3 to build an API and I have an model for products. Whenever I retrieve a product, I want to retrieve the product's rating and it's recommended rate. I also have a model for reviews and products have many reviews.

$product = Product::where('slug', $slug)->with('reviews')->first()->toArray();

Rating is computed by looping through $product->reviews in the controller, adding up the score of each review, then dividing it by the total number of reviews.

if (count($product['reviews']) > 0) {
    $i = 0;
    $totalScore = 0;
    foreach ($product['reviews'] as $review) {
        $totalScore = $totalScore + $review['Rating'];
        $i++;
    }
    $product['averageReviewRating'] = $totalScore / $i;
} else {
    $product['averageReviewRating'] = null;
}

Recommended rate is computed with a SQL query.

$product['recommendedRate'] = round(DB::select("
    select ( count ( if (Recommend = 1,1,NULL) ) / count(*)) * 100 as rate 
    from Review where PrintProduct_idPrintProduct = " . $product['idPrintProduct']
)[0]->rate);

This leaves me with $product['averageReviewRating'] and $product['recommendedRate'] with the data I want but seems very sloppy. I would like to just be able to do something similar to this below and have those two values assigned to each object of a collection, than access them via $product->averageReviewRating and $product->recommendedRate or even not include them in with and have those values eagerly assigned.

$product = Product::where('slug', $slug)->with(['Reviews', 'RecommendedRate', 'AverageReviewRating'])->first();

Anyone know a way to do this with ORM? I've looked high and low and have not found anything.



from Newest questions tagged laravel-5 - Stack Overflow http://ift.tt/2k5AkDn
via IFTTT

Aucun commentaire:

Enregistrer un commentaire