• 根据product_id 获取 category_ids :

        /**
    * @param $product_id
    * @return array
    */
    public function mc_getCategoryIds($product_id)
    {
    // +++ get product the category id
    $registry = $this->mc_C['product'];
    $getObj = $this->mc_get_obj($registry);
    /**
    * @var \Magento\Catalog\Model\Product $getObj
    * \Magento\Catalog\Model\Product
    */
    $product = $getObj->load($product_id); /**
    * @var \Magento\Catalog\Model\Product $product
    * \Magento\Catalog\Model\Product
    */ return $product->getCategoryIds();
    }
  • 获取 category_name :
    /**
    * @param $product_id
    * @return mixed
    */
    public function mc_getCategoryName($product_id)
    {
    $cats = $this->mc_getCategoryIds($product_id);
    if(count($cats) ){
    $firstCategoryId = $cats[(count($cats)-1)];
    $registry = $this->mc_C['category'];
    $getObj = $this->mc_get_obj($registry); /**
    * @var \Magento\Catalog\Model\CategoryFactory $getObj
    */
    $_category = $getObj->create();
    /**
    * @var \Magento\Catalog\Model\CategoryFactory $_category
    */
    $data = $_category->load($firstCategoryId);
    /**
    * @var \Magento\Catalog\Model\CategoryFactory $data
    */
    return $data->getName();
    }
    return 0;
    }

以上简单的调用了栏目的名称。

FAQ:

1,如果使用不正确的 CategoryFactory 类

  • 're_category_c'=>\Magento\Catalog\Model\ResourceModel\Category\CollectionFactory::class,//fixme This class \Magento\Catalog\Model\ResourceModel\Category\Collection
  • 're_category_f'=>\Magento\Catalog\Model\ResourceModel\CategoryFactory::class,//fixme This class\Magento\Catalog\Model\ResourceModel\Category
  • 're_category'=>\Magento\Catalog\Model\ResourceModel\Category::class,//fixme This  Catalog category model

  正确的是:\Magento\Catalog\Model\CategoryFactory

  ResourceModel 与 Model 的区别:

 

 

Models : Models are where your main business logic should be handled and is a single instance of an object. The model will use the resource model to talk to the database and get/set data for it on save() and load().

Resource Model : A resource model is where your main C.R.U.D happens (CreateReadUpdateand delete). The resource model shouldn’t contain business logic however it will talk to the adapters and basically talk to the database.

 

2,如果使用不正确的通用SQL : 

  SQL:

select value from catalog_product_entity_varchar left join eav_attribute on
eav_attribute.attribute_id = catalog_product_entity_varchar.attribute_id
where
eav_attribute.attribute_code='name' and
catalog_product_entity_varchar.entity_id=2082

  CODE:

$_connection = $this->mc_get_obj(\Magento\Framework\App\ResourceConnection::class);//get class
$db_connection = $_connection->getConnection(\Magento\Framework\App\ResourceConnection::DEFAULT_CONNECTION);//connection
$category = $db_connection->fetchAll('select * from '.'`catalog_product_entity_varchar` '.'left join '.'`eav_attribute` '.'on '.
'`eav_attribute`.'.'`attribute_id`='.'`catalog_product_entity_varchar`.'.'`attribute_id` '.
'where '.'`eav_attribute`.'.'`attribute_code`='.'"name" '.'and '. '`catalog_product_entity_varchar`.'.'`entity_id`='.$vi['product_id']); var_dump($category[0]['value']);die;

  

  正确的SQL: 
  

SELECT
e.entity_id AS product_id
, e.type_id AS product_type
, e.sku,
(
SELECT
GROUP_CONCAT(DISTINCT(cv.value))
FROM
catalog_category_entity_varchar AS cv, catalog_category_product AS at_category_id
WHERE
at_category_id.category_id = cv.entity_id
AND (at_category_id.product_id = e.entity_id)
AND cv.attribute_id = 41 and cv.store_id = 0
) AS category_name
FROM catalog_product_entity AS e where e.entity_id=2082;

magento2.2.3 根据产品ID获取栏目名称的正确调用方式的更多相关文章

  1. 数据表自增Id获取时IDENTITY的正确使用方式

    在SQLServer中很多表主键会设置为自增列,有的业务需求需要知道新插入的自增Id是多少,一般我们会用SELECT @@IDENTITY来获取,可由于@@IDENTITY是个全局变量作用据较大,所以 ...

  2. 简单的 通过ID获取文件名称

    模型中的方法class 模型名{ /** * 通过ID获取文件名称 */ public static function getNameById($id) { $model = self::findOn ...

  3. 帝国cms在任意位置调用指定id的栏目名称和链接

    注意,这个代码无须放在灵动标签中,直接写入模板相应的位置就行了.[1]调用栏目名称: <?=$class_r[栏目ID]['classname']?>   示例:<?=$class_ ...

  4. 齐博x1.3通用栏目名称及参数调用接口

    对于全站的频道可以使用下面的方法取出相应的栏目名称及参数http://qb.net/index.php/cms/wxapp.sorts.html注意,只需要把qb.net换成你的域名,cms 换成其它 ...

  5. dedecms织梦副栏目名称和链接调用

    https://blog.csdn.net/qq_41805834/article/details/79552859

  6. dede织梦栏目页和文章页中获取当前栏目名称方法

    一般情况下,在dede织梦系统中列表页.栏目页和文章页中获取当前所在栏目名称只需要代码:{dede:type}[field:typename]{/dede:type}即可,不需要定义ID,默认的就是当 ...

  7. dedecms提取某栏目及子栏目名称到首页怎么弄

    我们建网站时有不同的需求,例如为页面创建一个栏目导航,用dedecms如何提取某栏目及子栏目名称和链接呢?如下图所示,先列出指定的顶级栏目,在下方再列出此栏目的所有子栏目. 之前ytkah说过dede ...

  8. Kubernetes 教程:根据 PID 获取 Pod 名称

    原文链接:https://fuckcloudnative.io/posts/find-kubernetes-pod-info-from-process-id/ 在管理 Kubernetes 集群的过程 ...

  9. magento获取当前栏目ID号与栏目名称函数

    Magento获取当前栏目ID:$_cat= new Mage_Catalog_Block_Navigation();$curent_cat= $_cat->getCurrentCategory ...

随机推荐

  1. MySQL8.0数据库基础教程(二)-理解"关系"

    1 SQL 的哲学 形如 Linux 哲学一切都是文件,在 SQL 领域也有这样一条至理名言 一切都是关系 2 关系数据库 所谓关系数据库(Relational database)是创建在关系模型基础 ...

  2. gRPC初识

    RPC算是近些年比较火热的概念了,随着微服务架构的兴起,RPC的应用越来越广泛.本文介绍了RPC和gRPC的相关概念,并且通过详细的代码示例介绍了gRPC的基本使用. RPC是什么 在分布式计算,远程 ...

  3. EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)

    题意: 一张由 n 个点,m 条边构成的有向无环图.每个点有点权 Ai.QQ 小方想知道所有起点为 1 ,终点为 n 的路径中最大的中位数是多少. 一条路径的中位数指的是:一条路径有 n 个点,将这  ...

  4. YUM源部署和使用

    1.前言 为什么需要内部yum源呢,有可能是业务内部的服务器对外是不通了,居于一些安全方面的考虑.内部yum源又有什么好处呢,第一,速度快:第二,内网可控,外网有问题也不影响内网包的下载和安装等. 2 ...

  5. 基于CentOS-7 部署open

    一.OpenVPN概述 OpenVPN是一个用于创建专用网络加密通道的源软件.可在公司和家庭之间.部署类似于局域网的专用网络通道 而且OpenVPN使用起来也非常方便.几乎可以运行在任何平台.同时也采 ...

  6. Centos7更改屏幕显示率

    第一种,在虚拟机中安装VMwareTools,之后在虚拟机菜单栏"查看"这一项选择立即适应窗口. 第二种,修改/boot/grub2/grub.cfg配置文件,在终端输入su,输入 ...

  7. k8s系列---k8s认证及serviceaccount、RBAC

    http://blog.itpub.net/28916011/viewspace-2215100/ 对作者文章有点改动 注意kubeadm创建的k8s集群里面的认证key是有有效期的,这是一个大坑!! ...

  8. PDO连接不上又不报错的问题

    前提:连接PDO需要在将php.ini配置文件的 ;extension=pdo_mysql,去掉前面的;号. 今天闲来无事就重新弄了一下PDO,结果怎么都连不上.而且没有给出错误的信息.代码如下: & ...

  9. 国内jenkins搭建不再龟速的方式

    最新国内jenkisn搭建过程 第一步下载jenkins 点击进入清华源jenkins下载地址,我们下载的是jenkins-2.204.2.zip版本 之后解压后安装. 第二步配置管理员密码 自动弹出 ...

  10. VS2015中使用qt开发客户端,QPluginLoader加载dll为null的解决办法

    1,问题重现: 使用vs2015开发一款qt软件,使用了QPluginLoader动态加载插件的方式,调试的时候,发现dll模块没有加载进来,debug发现QPluginLoader的instance ...