十三、用表关联结构实现类目管理



一切事物都是有联系的,联系在一起的事物必定成结构性。比如博客多了就需要归类,映射到数据库表上就是关联关系,映射到model上就是多对一关系的一个成员变量。本节就介绍怎么配置sonata-admin实现博客的分类

请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

以终为始

 

想象一下我们希望有怎么样的分类,比如你是一个音乐爱好者,那么你的博客可能会分成:摇滚、流行、古典……;如果你是一个体育爱好者,那么可能会分成:篮球赛事、户外运动、健身……;如果是一个IT爱好者,可能会分成:大数据、数学知识、信息检索……。那么首先我们需要的是一个类目表。

 

创建src/AppBundle/Entity/Subject.php这个model,如下:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Subject
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Subject
{
    /**
     * @ORM\OneToMany(targetEntity="BlogPost", mappedBy="subject")
     */
    private $blogPosts;

    public function __construct()
    {
        $this->blogPosts = new ArrayCollection();
    }

    public function getBlogPosts()
    {
        return $this->blogPosts;
    }


    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="photo", type="string", length=255)
     */
    private $photo;
    /**
     * @var string
     *
     * @ORM\Column(name="introduce", type="string", length=255)
     */
    private $introduce;

    /**
     * @return string
     */
    public function getIntroduce()
    {
        return $this->introduce;
    }

    /**
     * @param string $introduce
     */
    public function setIntroduce($introduce)
    {
        $this->introduce = $introduce;
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Subject
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set photo
     *
     * @param string $photo
     * @return Subject
     */
    public function setPhoto($photo)
    {
        $this->photo = $photo;

        return $this;
    }

    /**
     * Get photo
     *
     * @return string
     */
    public function getPhoto()
    {
        return $this->photo;
    }
}

 

 

这里的private $blogPosts;是一个一对多(OneToMany)的关系类型,@ORM声明了targetEntity="BlogPost", mappedBy="subject",表示$blogPosts只能存储BlogPost类型的数据,并且这些数据都是以BlogPost::subject来做hash的,那么就需要BlogPost必须有subject成员变量,下面我们来添加,修改src/AppBundle/Entity/BlogPost.php,添加:

    /**
     * @ORM\ManyToOne(targetEntity="Subject", inversedBy="blogPosts")
     */
    private $subject;

 

并添加get和set方法:

    public function setSubject(Subject $subject)
    {
        $this->subject = $subject;
    }

    public function getSubject()
    {
        return $this->subject;
    }

 

这里的private $subject;是一个多对一(ManyToOne)的关系类型,@ORM声明了targetEntity="Subject", inversedBy="blogPosts",表示$subject存储的是Subject类型的数据,并和Subject::blogPosts有对应关系

 

添加SubjectAdmin管理类,添加src/AppBundle/Admin/SubjectAdmin.php文件,内容如下:

<?php

namespace AppBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;

class SubjectAdmin extends Admin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper->add('name', 'text')
            ->add('introduce', 'text')
            ->add('photo', 'text');
    }

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper->add('name');
    }

    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper->addIdentifier('name')
            ->add('introduce')
            ->add('photo');
    }
}

 

执行如下语句来创建subject表和更新blogpost表:

[root@centos7vm mywebsite]# php app/console doctrine:schema:update --force

请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

修改app/config/services.yml注册admin.subject服务,在services组添加:

    admin.subject:
        class: AppBundle\Admin\SubjectAdmin
        arguments: [~, AppBundle\Entity\Subject, ~]
        tags:
            - { name: sonata.admin, manager_type: orm, label: Subject }

 

这时打开http://172.16.142.130/app_dev.php/admin看到多出了subject的管理界面:

 

我们添加一个subject,如下:

保存后,看到我们生成了一个subject数据:

 

这里的photo先随便填一个,以后再用到这个字段

 

如果你打算新建一个blogpost来指定一个subject,那么会发现,在blogpost的编辑界面没有选择科目的地方,这时怎么办呢?我们还需要修改一下BlogPostAdmin管理类,修改src/AppBundle/Admin/BlogPostAdmin.php,如下:

        $formMapper
            ->add('title', 'text')
            ->add('body', 'ckeditor', array('autoload' => true))
            ->add('subject', 'sonata_type_model', array(
                'class' => 'AppBundle\Entity\Subject',
                'property' => 'name',
            ))
            ->add('create_time', 'sonata_type_date_picker', array(
                'format'=>'yyyy-MM-dd HH:mm:ss',
                'dp_default_date'        => date('Y-m-d H:i:s'),));

 

这时打开blogpost编辑界面看到:

 

 

多出了subject选择框

 

我们新建一篇看下:

 

列表中列出了这篇blog,但是没有看到类目呢?这是因为我们没有配置显示subject字段,继续修改src/AppBundle/Admin/BlogPostAdmin.php的configureListFields方法,内容如下:

        $listMapper
            ->addIdentifier('title')
            ->add('subject.name')
            ->add('createTime')
            ;

 

这时候再看blog列表:

 

 

成功啦

 

下面的任务就留给你自己:用同样的方式来添加category,用来表示另一个层级的分类,比如:原创、转载、学习笔记……,这样你的文章可以是:“大数据”类别下的“原创”文章。

 

提示一下:

第一步添加如下文件:src/AppBundle/Entity/Category.php、src/AppBundle/Admin/CategoryAdmin.php

第二步修改如下文件:src/AppBundle/Entity/BlogPost.php、src/AppBundle/Admin/BlogPostAdmin.php

第三步修改如下配置:app/config/services.yml

第四步更新数据库:php app/console doctrine:schema:update --force

 

最终效果如下:

 

添加博客页面

 

 

博客列表页面

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用 SQL 查询语句来实现这个功能。首先,您需要创建一个包含商品类别、商品名称和销售额的表格。然后,您可以使用以下 SQL 查询语句来筛选每个类别的销售额前十的商品: SELECT category, product_name, sales_amount FROM products WHERE category = 'category_name' ORDER BY sales_amount DESC LIMIT 10; 在这个查询语句中,您需要将“category_name”替换为您要筛选的商品类别名称。这个查询语句将按照销售额从高到低的顺序返回前十个商品。 ### 回答2: 在表格中实现每个类目销售额前十商品的筛选可以通过以下步骤完成: 1. 准备数据:将销售数据按照类目分类,并包括商品名称、销售额等信息。 2. 创建一个新表格:在新的工作表或新的工作簿中,创建一个表格,用于显示每个类目销售额前十的商品。 3. 添加表头:在新表格的第一行添加表头,可以包括类目、商品名称、销售额等列。 4. 排序数据:按照类目和销售额字段对数据进行排序,确保每个类目的商品按照销售额从高到低排列。 5. 筛选数据:针对每个类目,筛选出销售额前十的商品。可以使用Excel的筛选功能,或者使用公式来筛选数据。 6. 填充数据:将筛选出的数据填充到新表格中,确保每个类目只显示销售额前十的商品。 7. 完善表格:可以根据需要,添加其他列或信息,使表格更加完善和易于阅读。 8. 更新数据:如果销售数据有更新,可以根据需要,重新排序并更新筛选出的数据。 通过以上步骤,可以在表格中实现每个类目销售额前十商品的筛选,方便用户进行数据分析和决策。 ### 回答3: 要实现每个类目销售额前十商品筛选,可以按照以下步骤进行操作: 1. 首先,创建一个包含所需数据的表格。表格的每一列代表一个属性,如商品名称、类目、销售额等。每一行代表一个商品的数据。 2. 在表格中,将所有商品按照类目进行分类。可以通过在类目列中输入不同的类目名称来进行分类。 3. 在表格中,计算每个商品的销售额。可以通过在销售额列中输入相应的数值来计算。 4. 在表格中,按照类目列进行筛选,只显示某一类目下的商品信息。 5. 对于筛选出的类目,按照销售额列进行排序,将销售额高的商品排在前面。可以通过在销售额列进行排序操作来实现。 6. 在表格中,选取前十个商品。可以通过在表格中选择前十行的方式来实现。 7. 最后,可以将筛选出的每个类目销售额前十商品的信息记录下来,或者将其导出为一个新表格,以便后续分析或使用。 通过以上步骤,就可以在表格中实现每个类目销售额前十商品的筛选。这样便可以方便地对商品进行分类和排序,从而得到具体的筛选结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值