我正在构建一个函数,它将把我的用户所做的事情添加到我的数据库中,以便我可以为其他用户的活动提要构建一个活动提要。
到目前为止我想象的是什么样子。
活动表
id | user_id | source | source_id | timestamp示例输入
1 | 1 | photo_upload | 54 | 1333906150 //54 being the ID of the photo in my DB
2 | 1 | follow | 2 | 1333906159 // 2 being the id of a user通过这种方式,我可以轻松地为用户活动从数据库中提取信息,然后根据用户活动的来源"user_id = {$followers}向他们显示信息,例如显示photo_upload的图像。
编辑什么是显示不同类型提要的最佳方式。这是我目前所拥有的,但似乎有点多。
<?php
$grab = mysql_query("SELECT * FROM `activity` WHERE `user_id` IN (".$following.") ORDER BY `id` DESC");
while($row = mysql_fetch_array($grab)){
switch ($row['source']) {
case "photoupload":
// Display photo upload layout
break;
case "follow":
// Display follow layout
break;
}
}
?>有人认为有什么方法可以改进这一点吗?
发布于 2012-04-08 18:59:54
创建一个描述源项类型的抽象类:
abstract class Application_Feed_Item_Abstract {
protected $_item;
public function __construct($itemData) {
$this->_item = $itemData;
}
abstract public function render();
}针对不同类型的内容实现该类:
class Application_Feed_Item_Photo extends Application_Feed_Item_Abstract {
public function render() {
//Custom rendering logic for a Photo
return '<div>Watch my <a href="photo.php?id=' . $this->_item['source_id'] . '">photo</a></div>';
}
}
class Application_Feed_Item_Follow extends Application_Feed_Item_Abstract {
public function render() {
//Custom rendering logic for a Follower
return '<div>I got a new <a href="photo.php?id=' . $this->_item['source_id'] . '">follower</a></div>';
}
}因此,当您提取记录时,您可以动态创建一个呈现器对象,具体取决于饲料项目的类型:
//Pull items from database and store them as an Array or other iterable object.
//Here i assume we call this collection of rows from the database $feeditems
//Mapping of source to renderer classes
$types = array(
"photoupload" => "Application_Feed_Item_Photo",
"follow" => "Application_Feed_Item_Request",
"somethingelse" => "Application_Feed_Item_Somethingelse"
);
//Process every item
foreach($feeditems as $item) {
$type = $item['source'];
if(!array_key_exists($type, $types)) {
throw new Exception("Unsupported feeditem type.");
}
$type = $types[$type];
$renderer = new $type($item);
echo $renderer->render();
}只是一个松散的想法来实现它。但是,正如另一个用户所指出的,根据您的需求,有许多不同的方法来实现它。你在问题中使用的方法会很好。
发布于 2012-04-08 18:22:46
剥猫皮有很多种方法。同样,也有许多方法可以实现所需的相同结果。
关于“改进”国际海事组织的一些建议如下:
1.使用AJAX调用.将这些数据作为预生成的HTML获取。
在加载页面之后,使用AJAX调用,您可以让服务器构建用户活动提要的HTML片段。这将允许您的页面加载得更快,您的内容将在不久后加载。
您甚至不必在服务器上构建HTML --您还可以从AJAX调用中传回一个JSON对象,并使用JavaScript构建HTML。
2.为用户提要创建一个缓存的静态HTML文件,该文件简单地包含在标记中.
您可以让服务器在特定的时间间隔(例如,每30分钟)生成用户所需的所有HTML,然后将该HTML保存到要包含在现有HTML中的文件中。您可以使用PHP的include()函数来完成这一任务。
使用这种方法,activity在刷新时会有延迟,所以这可能不是最好的选择--但是如果您使间隔更小--例如,每5分钟就会保存很多对DB的调用。
查看cron作业 --您可以使用它们来安排更新。
index 3.在数据库中的 user_id 字段中放置一个,因为您正在使用它进行用户搜索。
这是一个非常重要的问题,特别是当您期望数据库中存在许多条目时。在用于搜索表的字段上放置索引将极大地提高查询的性能。
我相信这里还有更多的建议。
https://stackoverflow.com/questions/10064852
复制相似问题