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

我有一个跟踪视图的模型。 这是一个非常基本的模型,您可以在下面看到。 目前只有2种方法。 一个查询数据库,一个查询添加到视图表。

检查表的函数返回视图对象或null。 这是一个在save_view方法中调用的静态方法。 如果save_view方法返回null,则构建一个新视图,但如果它返回一个对象,则视图属性将被拉出,然后向其中添加1,然后将其保存到数据库中。

这是奇怪的地方。

新的构建工作正常。 它只是初始化并保存1行视图。 如果我使用已经初始化的视图对象,并将1添加到视图中,它将保存为2.我不知道发生了什么。

如果我用Debug::dump($view);中断流程Debug::dump($view); 如预期的那样节省1。

所以,例如,如果行当前有3个视图,并且我做$view->set('views', ($view->views + 1)); ,你会认为它会保存为视图= 4,但它会跳过视图= 5。当中断时它保存为视图= 4。

我已经尝试了这种方法,似乎没有任何工作。 我可以让他们都保存,但我仍然得到相同的意外结果。 我在这里错过了一些基本的东西,是否有可能代码流动得太快,或者我发现了一个错误? 以前从未见过这样的事情。 谢谢参观。

代码如下:

<?php

class Model_View extends OrmModel {

    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()调用,然后检查你的日志。 也许是什么导致你的代码被调用两次?

链接地址: http://www.djcxy.com/p/64813.html

上一篇: Fuelphp ORM unexpected results when adding to model property

下一篇: Caching only a relation data from FuelPHP ORM result