商品与品牌两个表如何进行一对一,一对多,多对多的关联
上面是商品表,下图是品牌表
如何把这两张表关联?
比喻:
就好比你去超市买卫生巾,你问超市的人员,他说在生活类的产品里面
你这衣服哪个牌子?耐克的,牌子货
鞋子呢?阿迪达斯的!
第一步 考虑在表结构上进行关联:
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')
外连代表间谍剧的普通版:共产党地下工作者知道上级接头人是谁并且是好的,他从国民党套到情报,来交接。
网友评论