好的,这可能令人困惑,所以我希望我能正确解释。
我有4张桌子:
业务 相片 视频 类
我想在主页(或其他地方)显示“精选”商家,我想根据是否有该商家的照片或视频在表格行中显示“是”或“否”。
示例:Joes Crab Shack没有视频或照片,但有特色。因此,当他的行被回显时,它将显示商家名称和业主,但是在照片或视频单元格中将没有数据,因此在视频和照片列中它将说明否。否则,如果相反的情况是真的,那么会说是的。
答案 0 :(得分:1)
你可以用这样的东西作弊:
SELECT b.[other stuff],
(SELECT COUNT(1) FROM photos WHERE busid = b.id) AS photo_count,
(SELECT COUNT(1) FROM videos WHERE busid = b.id) AS video_count
FROM business AS b [etc]
photo_count
& video_count
将返回0或大于0 - 很容易在PHP中获得no / yes。这也可以阻止每个企业拥有超过1张照片/视频所带来的重复结果。
警告!:将其转换为您正在使用的ORM ......我不确定ORM是否合适。但如果它不是在from()
&中的“AS”别名上咆哮join()
,也许你可以毫无问题地隐藏select()
中的子查询。
答案 1 :(得分:0)
我要去捅这个。
我要做的是,在生成用于显示“特色”商家的表格时,我会调用您的数据库,这通常是在生成照片和视频类别时检查并检查输出的。如果有什么东西那么它就说是,如果数据库的返回为空,那么可以安全地假设没有任何照片或视频,因此你可以打印出一个号码。
答案 2 :(得分:0)
我将在这里假设您的照片和视频表包含每个商家超过1条记录,“一对多”关系。
在这种情况下,您需要重新考虑您的方法或至少对数据库结果进行一些格式化。目前,如果Joes crab shack有超过1个视频和/或照片,那么Joes crab shack将会有多个结果。
如果您需要照片/视频结果,可以在收到结果时格式化结果,以创建一个多维数组/对象,其中$featured['videos']
或$featured['photos]
将包含您的联接结果,如果格式化的数组不包含“视频”键,因此您没有视频结果。
如果你需要知道的是它是否返回超过0行,那么在模型中创建两个新方法来计算属于特定业务的视频和照片。现在,如果方法返回超过0行或者否则返回“否”,这只是回音“是”的问题。
编辑:模型功能应该看起来像这样
function frontPageList() {
$this->db->select('b.busname, b.busowner, b.webaddress');
$this->db->select('(SELECT COUNT(1) FROM photos WHERE busid = b.id) AS photo_count', FALSE);
$this->db->select('(SELECT COUNT(1) FROM videos WHERE busid = b.id) AS video_count', FALSE);
$this->db->from ('business AS b');
$this->db->where('featured', '1');
return $this->db->get();
}
答案 3 :(得分:0)
我假设这些表的设置方式如下:
您将为每个业务创建一个唯一的ID(自动增量很好地工作),并且每当为业务上传照片或视频时,该记录将被插入到附加了该ID的相应表中(ID列或其他)
每个表都允许多个业务条目(Dyllon指出“一对多”)。
因此,无论何时显示特色商家,您都会使用唯一ID对视频和照片表进行查询,并查找返回的行。行=是,行=否。
一个问题: 您是要将图像存储在数据库或文件名中并将它们上载到目录中吗?
我将添加到上述建议中的唯一其他输入是构造表,以便表本身中永远不会有任何空值,这可能是因为您已经为此项目提供了四个表。 / p>
我是第二个通过返回数据存储和排序的多维数组/对象方法。
一个不错的选择是使用PHP图像功能来调整作为照片缩略图返回的第一个图像的大小 - 你也可以为每个视频捕捉一个帧 - 所以不是是或否,我们看起来像缩略图对于两者或'无图像/视频'slug。
不多,但是我的$ .02。
答案 4 :(得分:0)
SELECT b.busname
, b.busowner
, b.webaddress
, IF (EXISTS (SELECT 1 FROM photos p WHERE p.busid = b.id), 'Yes', 'No') has_photo
, IF (EXISTS (SELECT 1 FROM video v WHERE v.busid = b.id), 'Yes', 'No') has_video
FROM business b
WHERE b.featured = 1
答案 5 :(得分:0)
好的,这是我根据你们的建议解决问题的方法:
<强>型号:强>
function frontPageList() {
$this->db->select('b.busname, b.busowner, b.webaddress, p.photoname, v.title');
$this->db->from ('business AS b');
$this->db->where('featured', '1');
$this->db->join('photos AS p', 'p.busid = b.id', 'left');
$this->db->join('video AS v', 'v.busid = b.id', 'left');
return $this->db->get();
}
<强>控制:强>
function index()
{
$this->load->model('Business_model');
$data['featured'] = $this->Business_model->frontPageList();
$data['user_id'] = $this->tank_auth->get_user_id();
$data['username'] = $this->tank_auth->get_username();
$data['page_title'] = 'Welcome To Jerome - Largest Ghost Town in America';
$data['page'] = 'welcome_message'; // pass the actual view to use as a parameter
$this->load->view('container',$data);
}
查看:强>
<table id="businessTable">
<thead><tr><th>Business Name</th><th>Business Owner</th><th>Web</th><th>Photos</th><th>Videos</th></tr></thead>
<?php foreach ($featured->result() as $row): ?>
<tr>
<td><?=$row->busname?></td>
<td><?=$row->busowner?></td>
<td><a href="<?=$row->webaddress?>">Visit Site</a></td>
<td>
<?php if(isset($row->photoname)):?>
no
<?php else:?>
yes
<?php endif?>
</td>
<td>
<?php if(isset($row->title)):?>
no
<?php else:?>
yes
<?php endif?>
</td>
</tr>
<?php endforeach; ?>
</table>