我有一个跟踪视图的模型。这是一个非常基本的模型,如下图所示。目前只有2种方法。一个查询数据库,一个添加到视图表。
检查表的函数返回一个视图对象或null。它是在save_view方法内部调用的静态方法。如果save_view方法返回null,则构建一个新视图,但如果它返回一个对象,则提取视图属性,并向其添加1,然后保存到数据库中。
这就是奇怪的地方。
新版本运行良好。它只是用一个视图初始化并保存一行。如果我使用已经初始化的视图对象,并将1添加到视图中,它将保存为2。我不知道发生了什么事。
如果我用Debug::dump($view);
中断流,它按预期节省1。
因此,例如,如果行当前有3个视图,我做$view->set('views', ($view->views + 1));
,你会认为它会保存为views = 4,但它会跳过views = 5。当被中断时,它保存为views = 4。
我已经尝试了各种各样的方法,但似乎都没有效果。我可以让他们都存起来,但我还是得到了同样意想不到的结果。我在这里错过了一些基本的东西,是可能的代码流动太快,还是我发现了一个bug?从来没见过这样的事。谢谢你看一看。
代码如下:
<?php
class Model_View extends 'Orm'Model {
protected static $_properties = array(
'id',
'media_type',
'media_id',
'views',
);
protected static $_table_name = 'views';
/**
* Saves views to the database.
* @param int $media_id The id of the Media
* @param int $media_type The key value of the media
* @return boolean
*/
public static function save_view($media_id, $media_type) {
try {
// Check if view exists //
$view = self::check_view($media_id, $media_type);
if (!$view) {
// If view doesn't exist, create a new row //
$view = self::forge(array(
'media_type' => $media_type,
'media_id' => $media_id,
'views' => 1
));
} else {
//Debug::dump($view);
// Update existing row //
$view->set(array('views' => ($view->views + 1)));
}
// Save results //
return $view->save();
} catch (Exception $e) {
Log::error($e, __METHOD__);
return false;
}
}
/**
* Checks the database to see if there is already a matching row
* for the selected media.
* @param int $media_id Id of the media
* @param int $media_type Key value of media
* @return Model_View|null
*/
private static function check_view($media_id, $media_type) {
try {
// Check database for matching row //
$view = self::find('first', array('where' => array(
'media_id' => $media_id,
'media_type' => $media_type
)
));
return $view;
} catch (Exception $e) {
Log::error($e, __METHOD__);
return null;
}
}
}
对于任何因为同样的问题来这里的人:我错了,这不是一个问题与Fuelphp ORM。这是一个HTTP请求寻找我的图标的问题。我使用的是相对路径,它生成了一个额外的HTTP请求。
请参阅我的问题的延续和解决方案在Fuelphp论坛
我已经尝试过了(最新的1.8/开发代码),但我不能复制这个。当我在控制器中这样做时:
Model_View::save_view(1, 'A');
Model_View::save_view(1, 'A');
Model_View::save_view(1, 'A');
Model_View::save_view(1, 'A');
Model_View::save_view(1, 'A');
在表中得到一条包含
的记录1,A,1,5
我对你的代码唯一的评论是你应该使用'static'而不是'self'。ORM在很大程度上依赖于后期静态绑定,因此这可能会导致后续的问题。它不会导致您的问题,因为它在这里工作得很好,并且我无法在您的代码中看到任何其他建议。我将开始添加一些Log::info()
调用到它,并检查您的日志。也许是某些原因导致代码被调用两次?