Product.php 8.1 KB
<?php

namespace App\Models\Product;

use App\Helper\Arr;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;

/**
 * App\Models\Product\Product
 *
 * @method static get()
 * @property int $id
 * @property int $project_id
 * @property string $title
 * @property string $thumb 封面
 * @property mixed|null $gallery 图集
 * @property mixed|null $attrs 属性参数
 * @property string|null $attr_id 通用参数
 * @property string|null $category_id 分类 多个,号隔开
 * @property string|null $keyword_id 关键词标签 多个,号隔开
 * @property string|null $intro 简介
 * @property string|null $content 详情
 * @property mixed|null $describe 描述
 * @property string $describe_id 通用描述
 * @property mixed|null $seo_mate seo tdk
 * @property string $related_product_id 相关产品 多个,号隔开
 * @property int $sort 排序
 * @property int $status 状态 0草稿 1已上架 2已下架
 * @property int $created_uid 创建者
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property \Illuminate\Support\Carbon|null $deleted_at
 * @property string|null $route 路由
 * @property mixed|null $icon 图标
 * @property string|null $product_type 产品类型:1,一般产品;2:推荐产品(recommend);3:热销产品(hot)
 * @property int $is_upgrade 0:6.0 1:4.0,5.0升级
 * @property string|null $send_time 发布时间
 * @property int|null $six_read 1:导入数据可按6.0显示
 * @method  \Illuminate\Database\Eloquent\Builder|Product newModelQuery()
 * @method  \Illuminate\Database\Eloquent\Builder|Product newQuery()
 * @method  \Illuminate\Database\Eloquent\Builder|Product onlyTrashed()
 * @method static \Illuminate\Database\Eloquent\Builder|Product query()
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereAttrId($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereAttrs($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereCategoryId($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereContent($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereCreatedAt($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereCreatedUid($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereDeletedAt($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereDescribe($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereDescribeId($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereGallery($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereIcon($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereId($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereIntro($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereIsUpgrade($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereKeywordId($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereProductType($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereProjectId($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereRelatedProductId($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereRoute($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereSendTime($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereSeoMate($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereSixRead($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereSort($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereStatus($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereThumb($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereTitle($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product whereUpdatedAt($value)
 * @method  \Illuminate\Database\Eloquent\Builder|Product withTrashed()
 * @method  \Illuminate\Database\Eloquent\Builder|Product withoutTrashed()
 * @mixin \Eloquent
 */
class Product extends Base
{
    use SoftDeletes;

    //设置关联表名
    protected $table = 'gl_product';
    //连接数据库
    protected $connection = 'custom_mysql';
    const STATUS_DRAFT = 0;
    const STATUS_ON = 1;
    const STATUS_RECYCLE = 2;


    public static function statusMap(){
        return [
            self::STATUS_DRAFT    => '草稿',
            self::STATUS_ON   => '已发布',
            self::STATUS_RECYCLE  => '回收站',
        ];
    }

    /**
     * @var 获取产品类型
     */
    public $productType = [
        1=>'一般产品',
        2=>'推荐产品',
        3=>'热销产品'
    ];


    /**
     * 产品列表
     * @param $map
     * @param $page
     * @param $row
     * @param string $order
     * @param string[] $fields
     * @param string $sort
     * @return array
     * @author zbj
     * @date 2023/10/17
     */
    public function product_lists($map, $page, $row, $order = 'id', $fields = ['*'], $sort = 'desc'): array
    {
        $category_id = $map['category_id'] ?? 0;
        $query = $this->where(function ($query) use ($category_id) {
            if ($category_id) {
                $category_ids = Category::getChildIdsArr($category_id);
                $query->whereIn('id', function ($subQuery) use ($category_ids) {
                    $subQuery->select('product_id')
                        ->from('gl_product_category_related')
                        ->whereIn('cate_id', $category_ids)
                        ->groupBy('product_id');
                });
            }
        });
        unset($map['category_id']);
        $query = $this->formatQuery($map, $query);
        $query = $this->sortOrder($query,$order,$sort);
        $lists = $query->select($fields)->paginate($row, ['*'], 'page', $page);
        if (empty($lists)) {
            return [];
        }
        $lists = $lists->toArray();
        return $lists;
    }


    public function getThumbAttribute($value){
        if(!empty($value)){
            $value =  json_decode($value,true);
            if(!empty($value['url'])){
                $value['url'] = getImageUrl($value['url']);
            }
        }
        return $value;
    }


    public function getGalleryAttribute($value){
        if(!empty($value)){
            $value = Arr::s2a($value);
            foreach ($value as $k => $v){
                if(!empty($v['url'])){
                    $v['url'] = getImageUrl($v['url']);
                }
                $value[$k] = $v;
            }
        }
        return $value;
    }

    /**
     * @remark :图标获取器
     * @name   :getGalleryAttribute
     * @author :lyh
     * @method :post
     * @time   :2023/7/21 11:11
     */
    public function getIconAttribute($value){
        if(!empty($value)){
            $value = Arr::s2a($value);
            foreach ($value as $k => $v){
                $v = getImageUrl($v);
                $value[$k] = $v;
            }
        }
        return $value;
    }


    public function getAttrsAttribute($value){
        return  Arr::s2a($value);
    }

    public function getDescribeAttribute($value){
        return  Arr::s2a($value);
    }



    public function getSeoMateAttribute($value){
        return  Arr::s2a($value);
    }



    public function getCategoryIdAttribute($value){
        return Arr::setToArr(trim($value,','));
    }


    public function getAttrIdAttribute($value){
        return Arr::setToArr($value);
    }


    public function getDescribeIdAttribute($value){
        return Arr::setToArr($value);
    }


    public function getKeywordIdAttribute($value){
        return Arr::setToArr(trim($value,','));
    }

    public function getRelatedProductIdAttribute($value){
        return Arr::setToArr($value);
    }

//    public static function getNumByProjectId($project_id){
//        return self::where('project_id', $project_id)->where('status', self::STATUS_ON)->count();
//    }

    public function getSendTimeAttribute($value){
        if(!$value){
            return date('Y-m-d H:i:s', strtotime($this->getAttribute('created_at')));
        }
        return $value;
    }
}