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

Posted

技术标签:

【中文标题】Fuelphp ORM添加到模型属性时出现意外结果【英文标题】:Fuelphp ORM unexpected results when adding to model property 【发布时间】:2015-05-30 01:29:16 【问题描述】:

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

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

这就是奇怪的地方。

新版本运行良好。它只是用 1 个视图初始化并保存一行。如果我使用已经初始化的视图对象,并将 1 添加到视图中,它将保存为 2。我不知道发生了什么。

如果我用Debug::dump($view); 中断流程,它会按预期节省 1。

因此,例如,如果该行当前有 3 个视图,而我这样做 $view->set('views', ($view->views + 1));,您会认为它会保存为视图 = 4,但它会向前跳到视图 = 5。当被打断时,它会保存为视图= 4。

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

代码如下:

<?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 的问题。这是寻找我的 favicon 的 HTTP 请求的问题。我使用的是相对路径,它正在生成一个额外的 HTTP 请求。

请在Fuelphp Forums查看我的问题的延续和解决方案

【问题讨论】:

【参考方案1】:

我已经尝试过了(最新的 1.8/develop 代码),但我无法重现。当我在控制器中执行此操作时:

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

我对您的代码的唯一评论是您应该使用“静态”而不是“自我”。 ORM 很大程度上依赖于后期静态绑定,因此这可能会导致进一步的问题。它不会引起您的问题,因为它在这里工作正常,而且我在您的代码中看不到任何其他建议。我将首先添加一些Log::info() 调用,然后检查您的日志。可能是什么原因导致您的代码被调用了两次?

【讨论】:

是的,将我的 self:: 调用更改为 static:: 成功了。现在完美运行。当我尝试Log::info() 时,我得到:` Log::info('views: ' . ($view->views + 1), METHOD); INFO - 2015-05-30 08:21:15 --> Model_View::save_view - 视图:63 INFO - 2015-05-30 08:21:15 --> Model_View::save_view - 视图:64 ` 很奇怪,因为您的代码在这里运行良好。可能是因为我的测试中只加载了一个实例和一个模型,所以 self == static?很高兴你现在已经涵盖了它。 ;-)

以上是关于Fuelphp ORM添加到模型属性时出现意外结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 FuelPHP 中为关系查询添加条件?

向 FuelPHP 模型属性添加动态表单字段选项

使用jq选择对象时出现意外结果

仅缓存 FuelPHP ORM 结果中的关系数据

如何在fuelPHP Orm模型中选择MAX或COUNT

将子视图添加到 UICollectionViewCell 时出现意外行为