美文网首页程序员
TP电商项目:商品和品牌的关联

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

作者: 周行知 | 来源:发表于2018-12-30 05:15 被阅读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')

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

    相关文章

      网友评论

        本文标题:TP电商项目:商品和品牌的关联

        本文链接:https://www.haomeiwen.com/subject/qabmlqtx.html