程序员

TP电商项目:商品和品牌的关联

2018-12-30  本文已影响4人  周行知

商品与品牌两个表如何进行一对一,一对多,多对多的关联

上面是商品表,下图是品牌表

如何把这两张表关联?

比喻:

就好比你去超市买卫生巾,你问超市的人员,他说在生活类的产品里面

你这衣服哪个牌子?耐克的,牌子货

鞋子呢?阿迪达斯的!

第一步 考虑在表结构上进行关联:

create table p39_goods

(

id mediumint unsigned not null auto_increment comment 'Id',

goods_name varchar(150) not null comment '商品名称',

market_price decimal(10,2) not null comment '市场价格',

shop_price decimal(10,2) not null comment '本店价格',

goods_desc longtext comment '商品描述',

is_on_sale enum('是','否') not null default '是' comment '是否上架',

is_delete enum('是','否') not null default '否' comment '是否放到回收站',

addtime datetime not null comment '添加时间',

logo varchar(150) not null default '' comment '原图',

sm_logo varchar(150) not null default '' comment '小图',

mid_logo varchar(150) not null default '' comment '中图',

big_logo varchar(150) not null default '' comment '大图',

mbig_logo varchar(150) not null default '' comment '更大图',

brand_id mediumint unsigned not null default '0' comment '品牌id',

//你如果不会写,你可以照着抄id的写法,只是不加自增键即可,原因很简单它们类型一样

primary key (id),

key shop_price(shop_price),

key addtime(addtime),

key brand_id(brand_id),

key is_on_sale(is_on_sale)

)engine=InnoDB default charset=utf8 comment '商品';

我们需要有一个外键来关联他,brand_id 这就好像是产品表派出去的间谍,去跟品牌表里的里应外合,来得到品牌表所有信息。

如图所示:

程序代码关联

第一步 形象化思考  ,你展开你的想象,如果图示如下:

那么,我们需要怎么做呢?

首先我们需要在good控制器上进行关联?控制器是用来执行的,

代码如下:

//取出所有的品牌

      $brandModel=D('brand');

      $brandData=$brandModel->select();

整体代码如下:

public function add(){

      if(IS_POST){

          $model =D('goods');

      if( $model->create(I('post.'),1)) {

          if($model->add()){

              //插入到数据库

              $this->success('操作成功',U('lst'));

              exit;

              //http://localhost:8989/php/TpShop/Admin/goods/add

          }

      } 

        $error=$model->getError();

        $this->error($error);

      }

      //显示表单

      //取出所有的品牌

      $brandModel=D('brand');

      $brandData=$brandModel->select();

      /*

  $brandData=$brandModel->select();

不知道你看过伪装者没有,就是胡歌演日本间谍,首先是找到机密文件,才得到所有情报,其实编程也是一样,先找到,再取出数据。

解释类似于

select *from  p39_goods;

然后

返回 p39_goods所有数据

Array ( [0] => Array (

 [id] => 1

[brand_name] => Apple iPhone XS

 [site_url] => https://www.apple.com/cn/?afid=p238%7CtHpnaZWQ_mtid_18707vxu38484&cid=aos-cn-kwba-brand-bz

 [logo] => Brand/2018-12-28/5c25429e96b09.jpg )

 [1] => Array (

 [id] => 2

 [brand_name] => Apple iPhone XR 

[site_url] => https://item.jd.com/100001860805.html

 [logo] => Brand/2018-12-28/5c2543b3278fb.jpg ) 

[2] => Array ( 

[id] => 3 

[brand_name] => 苹果 

[site_url] => www.pinguo.com

 [logo] => ) )

*/

      $this->assign(array(

    'brandData'=>$brandData,

          '_page_title'=>'添加商品',

          '_page_btn_name'=>'商品列表',

          '_page_btn_link'=>U('lst'),

      ));

      $this->display();

}

你可能会问为什么是add页?

原因:你在添加页如果添加关联数据,你的列表页可以得到关联

第二步   制作下拉框

下面就是视图层的东东:

所在品牌请选择

<tr>

                    <td class="label">所在品牌</td>

                    <td>

                        <select name="brand_id">

                            <option value="">请选择</option>

                            <?php foreach($brandData as $k=>$v):?>

                            <option value="<?php echo $v['id'];?>"><?php echo $v['brand_name'];?></option>

                            <?php endforeach;?>

                        </select>

  </td>

</tr>

效果如图所示:

第三步 把品牌id 提交到保存到商品列表

//添加时调用create方法允许接收的字段

    protected  $insertFields='goods_name,market_price,shop_price,is_on_sale,goods_desc,brand_id';

  //修改时调用create方法允许接收的字段

    protected  $updateFields='id,goods_name,market_price,shop_price,is_on_sale,goods_desc,brand_id';

整体代码如下:

class GoodsModel extends Model{

    //添加时调用create方法允许接收的字段

    protected  $insertFields='goods_name,market_price,shop_price,is_on_sale,goods_desc,brand_id';

  //修改时调用create方法允许接收的字段

    protected  $updateFields='id,goods_name,market_price,shop_price,is_on_sale,goods_desc,brand_id';

}

第四步 在商品列表页展示品牌id

在列表页写入

<table cellpadding="3" cellspacing="1">

            <tr>

                <th>编号</th>

                <th>品牌</th>

                <th>商品名称</th>

                <th>logo</th>

                <th>市场价格</th>

                <th>本店价格</th>

                <th>上架</th>

                <th>添加时间</th>

                <th>操作</th>

            </tr>

            <?php foreach ($data as $k => $v): ?>

            <tr class="tron">

                <td align="center"><?php echo $v['id']; ?></td>

                    <td align="center"><?php echo $v['brand_id']; ?></td>

                <td align="center" class="first-cell"><span><?php echo $v['goods_name']; ?></span></td>

                <td align="center"><?php showImage($v['mid_logo']); ?></td>

                <td align="center"><?php echo $v['market_price']; ?></td>

                <td align="center"><?php echo $v['shop_price']; ?></td>

                <td align="center"><?php echo $v['is_on_sale']; ?></td>

                <td align="center"><?php echo $v['addtime']; ?></td>

                <td align="center">

                <a href="<?php echo U('edit?id='.$v['id']); ?>">修改</a>

                <a onclick="return confirm('确定要删除吗?');" href="<?php echo U('delete?id='.$v['id']); ?>">删除</a>

              </td>

            </tr>

            <?php endforeach; ?>

        </table>

外表查询

select a.* ,b.brand_name From p39_goods a LEFT JOIN p39_brand b ON a.brand_id=b.id;

解释:

这里a 是p39_goods的别名

b是p39_brans的别名

下图是解释这句话意思:

第1步   写上面在 GoodsModel 写入mysql的代码:

$data=$this->order("$orderby $orderway")

              ->field('a.*,b.brand_name')

              ->alias('a')

              ->join('LEFT JOIN p39_brand b ON a.brand_id=b.id')

                  //->join('LEFT JOIN __BRAND__ b ON a.brand_id=b.id')

                ->where($where)

                ->limit($pageObj->firstRow.','.$pageObj->listRows)

                ->select();

第二步 在lst.html体现

<table cellpadding="3" cellspacing="1">

            <tr>

                <th>编号</th>

                <th>品牌</th>

                <th>商品名称</th>

                <th>logo</th>

                <th>市场价格</th>

                <th>本店价格</th>

                <th>上架</th>

                <th>添加时间</th>

                <th>操作</th>

            </tr>

            <?php foreach ($data as $k => $v): ?>

            <tr class="tron">

                <td align="center"><?php echo $v['id']; ?></td>

                    <td align="center"><?php echo $v['brand_name']; ?></td>

                <td align="center" class="first-cell"><span><?php echo $v['goods_name']; ?></span></td>

                <td align="center"><?php showImage($v['mid_logo']); ?></td>

                <td align="center"><?php echo $v['market_price']; ?></td>

                <td align="center"><?php echo $v['shop_price']; ?></td>

                <td align="center"><?php echo $v['is_on_sale']; ?></td>

                <td align="center"><?php echo $v['addtime']; ?></td>

                <td align="center">

                <a href="<?php echo U('edit?id='.$v['id']); ?>">修改</a>

                <a onclick="return confirm('确定要删除吗?');" href="<?php echo U('delete?id='.$v['id']); ?>">删除</a>

              </td>

            </tr>

            <?php endforeach; ?>

        </table>


内连与外连的区别

内:没有关联取不出来,意思:b.id=a.brand_id时,才可取

形象的比喻

            ->join('LEFT JOIN p39_brand b ON a.brand_id=b.id')

外连代表间谍剧的升级版:话说共产党地下工作者都不知道上级接头人是谁,他可以从国民党套到情报,交给可信的党员。

  ->join(‘ JOIN p39_brand b ON a.brand_id=b.id')

外连代表间谍剧的普通版:共产党地下工作者知道上级接头人是谁并且是好的,他从国民党套到情报,来交接。

上一篇下一篇

猜你喜欢

热点阅读