Subversion-Projekte lars-tiefland.webanos.marine-sales.de

Revision

Revision 2 | Blame | Vergleich mit vorheriger | Letzte Änderung | Log anzeigen | RSS feed

<?php

    namespace App\Models;

    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Relations\BelongsTo;
    use Illuminate\Database\Eloquent\Relations\HasMany;
    use Illuminate\Support\Facades\Cache;
    use Spatie\Sluggable\HasSlug;
    use Spatie\Sluggable\SlugOptions;

    /**
 * App\Models\Item
 *
 * @property int $id
 * @property int|null $manufacturer_id
 * @property int|null $directory_id
 * @property int|null $shipping_group_id
 * @property string $name
 * @property string $slug
 * @property int $status
 * @property float $weight
 * @property string $description
 * @property string $ean
 * @property string|null $mpn
 * @property string $kennung
 * @property string $short_line_1
 * @property string $created_by
 * @property string $updated_by
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property-read \App\Models\Manufacturer|null $manufacturer
 * @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\ItemMedium> $medium
 * @property-read int|null $medium_count
 * @property-read \Illuminate\Database\Eloquent\Collection<int, \App\Models\Price> $price
 * @property-read int|null $price_count
 * @method static \Database\Factories\ItemFactory factory($count = null, $state = [])
 * @method static \Illuminate\Database\Eloquent\Builder|Item newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|Item newQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|Item query()
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereCreatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereCreatedBy($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereDescription($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereDirectoryId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereEan($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereKennung($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereManufacturerId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereMpn($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereName($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereShippingGroupId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereShortLine1($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereSlug($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereStatus($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereUpdatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereUpdatedBy($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Item whereWeight($value)
 * @mixin \Eloquent
 */
class Item extends Model
    {
        use HasFactory, HasSlug;

        /**
         * Get the options for generating the slug.
         */
        public function getSlugOptions(): SlugOptions
        {
            return SlugOptions::create()
                ->generateSlugsFrom( 'name' )
                ->saveSlugsTo( 'slug' )
                ->usingLanguage( 'de' )
                ->doNotGenerateSlugsOnUpdate()
                ->skipGenerateWhen( function ()
                {
                    return $this->directory_id < 0;
                } );
        }

        function medium(): HasMany
        {
            return $this->hasMany( ItemMedium::class )->orderBy( "rank" );
        }

        public function price(): HasMany
        {
            return $this->hasMany( Price::class )->where("preis","!=",0)->orderBy( "preis_index" );
        }

        public function manufacturer(): BelongsTo
        {
            return $this->belongsTo( Manufacturer::class );
        }

        // On the Model class add the following method.

        public function resolveRouteBinding( $value, $field = null ): ?Model
        {
            $cacheName = "item_" . $value;

            if ( Cache::has( $cacheName ) )
            {
                return Cache::get( $cacheName );
            }

            $result = $this->with( 'price', 'medium.medium', 'manufacturer' )->where( 'slug', $value )->firstOrFail();
            Cache::put( $cacheName, $result, 86400 );

            return $result;
        }
    }