Keyword.php 4.9 KB
<?php

namespace App\Models\Product;

use App\Helper\Arr;
use App\Helper\Common;
use App\Models\Base;
use App\Models\Com\NoticeLog;
use App\Models\RouteMap\RouteMap;
use App\Services\ProjectServer;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\DB;

class Keyword extends Base
{
//    use SoftDeletes;

    //设置关联表名
    protected $table = 'gl_product_keyword';

    //连接数据库
    protected $connection = 'custom_mysql';

    const TYPE_ORDER_KEYWORD = 1;//关键词标识,预约关键词标识

    const STATUS_ACTIVE = 1;
    //获取字母对应数字
    public $firstNumWord = [
        0=>"0",
        1=>"a",
        2=>"b",
        3=>"c",
        4=>"d",
        5=>"e",
        6=>"f",
        7=>"g",
        8=>"h",
        9=>"i",
        10=>"j",
        11=>"k",
        12=>"l",
        13=>"m",
        14=>"n",
        15=>"o",
        16=>"p",
        17=>"q",
        18=>"r",
        19=>"s",
        20=>"t",
        21=>"u",
        22=>"v",
        23=>"w",
        24=>"x",
        25=>"y",
        26=>"z",
        27=>"all",
    ];

    /**
     * @remark :视频
     * @name   :getKeywordVideoAttribute
     * @author :lyh
     * @method :post
     * @time   :2023/10/31 11:26
     */
    public function getKeywordVideoAttribute($value){
        if(!empty($value)){
            $value = Arr::s2a($value);
        }
        return $value;
    }

    /**
     * @param $value
     * @return array|mixed
     * @author zbj
     * @date 2023/11/21
     */
    public function getRelatedNewsIdsAttribute($value){
        if(!empty($value)){
            $value = Arr::setToArr($value);
        }
        return $value ?: [];
    }

    /**
     * @param $value
     * @return array|false|mixed|string[]
     * @author zbj
     * @date 2023/11/21
     */
    public function getRelatedBlogIdsAttribute($value){
        if(!empty($value)){
            $value = Arr::setToArr($value);
        }
        return $value ?: [];
    }

    /**
     * 随机获取关键词列表
     */
    public function getProductsKeywordsList($project)
    {
        return Keyword::where("project_id",$project->id)->where("status",1)->inRandomOrder()->take(10)->get();
    }

    /**
     * 拆解关键词, 拼接成为长尾关键词
     * @param $project_id
     * @return array
     */
    public static function extendKeyword($project_id)
    {
        $result = [];
        $keywords = self::where(['project_id' => $project_id])->where('type',self::TYPE_ORDER_KEYWORD)->pluck('seo_title', 'title')->toArray();
        if (empty($keywords))
            return $result;
        // $item:前缀 + 关键词 + 后缀
        foreach ($keywords as $keyword => $item) {
            try {
                if (empty($keyword) || empty($item))
                    continue;

                // 如果title数据无法正常解析, 就将数据完整填充
                $tmp = explode($keyword, $item);
                if (count($tmp) <= 1) {
                    array_push($result, $item);
                    continue;
                }

                // 正常数据 一个关键词会拆分成为 3或者5个关键词
                // 拆分规则:前缀 + 关键词; 关键词 + 后缀;前缀 + 关键词 + 后缀;
                $prefix = $tmp[0];
                $suffix_array = explode(',', $tmp[1]);
                array_push($result, trim($prefix . $keyword));
                foreach ($suffix_array as $suffix) {
                    array_push($result, trim($keyword . $suffix));
                    array_push($result, trim($prefix . $keyword . $suffix));
                }
            } catch (\Exception $e) {
                continue;
            }
        }
        return $result;
    }

    /**
     * @remark :批量保存到产品关键词中
     * @name   :saveBKeyword
     * @author :lyh
     * @method :post
     * @time   :2025/3/25 16:28
     */
    public function saveBKeyword($project_id,$keywords,$type = 0){
        foreach ($keywords as $v){
            if(empty($v)){
                continue;
            }
            $info = $this->read(['title'=>$v],['id']);
            if($info == false){
                $param['project_id'] = $project_id;
                $param['title'] = $v;
                $param['first_word'] = $this->first_word($param['title']);
                $param['type'] = $type;
                $this->addReturnId($param);
            }
        }
        NoticeLog::createLog(NoticeLog::TYPE_INIT_KEYWORD, ['project_id' => $project_id]);
        return true;
    }

    /**
     * @remark :获取字符串首字符
     * @name   :first_word
     * @author :lyh
     * @method :post
     * @time   :2025/3/25 16:42
     */
    public function first_word($title){
        $first_title = mb_substr(strtolower($title), 0, 1);
        if (is_numeric($first_title)){
            return 0;
        }
        $string_key = array_search($first_title, $this->firstNumWord);
        return $string_key ?: 27;
    }
}