Fuelphp ORM添加到模型属性时的意外结果


Fuelphp ORM unexpected results when adding to model property

我有一个跟踪视图的模型。这是一个非常基本的模型,如下图所示。目前只有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()调用到它,并检查您的日志。也许是某些原因导致代码被调用两次?