Maison >développement back-end >tutoriel php >Personnalisation de la collection à Laravel en utilisant collecté par

Personnalisation de la collection à Laravel en utilisant collecté par

Emily Anne Brown
Emily Anne Brownoriginal
2025-03-06 02:17:09477parcourir

Collection Customization in Laravel Using CollectedBy

Améliorer la fonctionnalité de collection éloquente avec l'attribut CollectedBy de Laravel. Cet attribut offre une approche rationalisée pour personnaliser les collections pour des types de modèles spécifiques, favorisant un code plus propre et plus maintenable. Oubliez la suppression de la méthode newCollection(); CollectedBy fournit une solution déclarative au niveau de la classe.

Auparavant, les collections de modèles d'adaptation impliquaient de remplacer la méthode newCollection(). Cette nouvelle méthode basée sur des attributs offre une solution supérieure au niveau de la classe.

use Illuminate\Database\Eloquent\Attributes\CollectedBy;

#[CollectedBy(CustomCollection::class)]
class YourModel extends Model
{
    // Model implementation
}

Considérons un catalogue de produits de commerce électronique:

// Product Collection
<?php namespace App\Collections;

use Illuminate\Database\Eloquent\Collection;

class ProductCollection extends Collection
{
    public function inStock()
    {
        return $this->filter(fn($product) => $product->stock_count > 0);
    }

    public function onSale()
    {
        return $this->filter(fn($product) => $product->discount_percentage > 0);
    }

    public function byPriceRange($min, $max)
    {
        return $this->filter(function($product) use ($min, $max) {
            $price = $product->getEffectivePrice();
            return $price >= $min && $price <= $max;
        });
    }

    public function topRated()
    {
        return $this->filter(fn($product) => $product->average_rating >= 4)
            ->sortByDesc('average_rating');
    }
}

//Product model
namespace App\Models;

use App\Collections\ProductCollection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Attributes\CollectedBy;

#[CollectedBy(ProductCollection::class)]
class Product extends Model
{
    public function getEffectivePrice()
    {
        return $this->discount_percentage > 0 ? $this->price * (1 - $this->discount_percentage / 100) : $this->price;
    }
}

L'attribut CollectedBy simplifie la personnalisation de la collection, ce qui entraîne des applications Laravel plus propres et plus lisibles.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn