Fuelphp ORM 添加到模型时出现意外结果 属性
Fuelphp ORM unexpected results when adding to model property
我有一个跟踪视图的模型。这是一个非常基本的模型,如下所示。目前只有2种方法。一个查询数据库,一个添加到视图 table。
检查 table returns 视图对象或 null 的函数。它是在 save_view 方法内部调用的静态方法。如果 save_view 方法 returns null,则建立一个新视图,但如果 returns 一个对象,则拉取视图 属性,并向其添加一个 1,然后保存到数据库中。
这就是奇怪的地方。
新版本运行良好。它只是用 1 个视图初始化并保存一行。如果我使用已经初始化的视图对象,并将 1 添加到视图,它会保存为 2。我不知道发生了什么。
如果我使用 Debug::dump($view);
中断流程,它会按预期节省 1。
因此,例如,如果该行当前有 3 个视图,而我 $view->set('views', ($view->views + 1));
,您会认为它会保存为 views = 4,但它会跳到 views = 5。中断时它保存为 views = 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 的问题。寻找我的网站图标的 HTTP 请求存在问题。我使用的是相对路径,它生成了一个额外的 HTTP 请求。
查看我的问题的后续内容和解决方案
我试过了(最新的 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');
我在 table 中得到一条记录,其中包含
1,A,1,5
我对您的代码的唯一评论是您应该使用 'static' 而不是 'self'。 ORM 很大程度上依赖于后期静态绑定,因此这可能会导致进一步的问题。它不会引起您的问题,因为它在这里工作正常,而且我在您的代码中看不到任何其他建议。我会首先向它添加一些 Log::info()
调用,然后检查您的日志。也许是某些原因导致您的代码被调用两次?
我有一个跟踪视图的模型。这是一个非常基本的模型,如下所示。目前只有2种方法。一个查询数据库,一个添加到视图 table。
检查 table returns 视图对象或 null 的函数。它是在 save_view 方法内部调用的静态方法。如果 save_view 方法 returns null,则建立一个新视图,但如果 returns 一个对象,则拉取视图 属性,并向其添加一个 1,然后保存到数据库中。
这就是奇怪的地方。
新版本运行良好。它只是用 1 个视图初始化并保存一行。如果我使用已经初始化的视图对象,并将 1 添加到视图,它会保存为 2。我不知道发生了什么。
如果我使用 Debug::dump($view);
中断流程,它会按预期节省 1。
因此,例如,如果该行当前有 3 个视图,而我 $view->set('views', ($view->views + 1));
,您会认为它会保存为 views = 4,但它会跳到 views = 5。中断时它保存为 views = 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 的问题。寻找我的网站图标的 HTTP 请求存在问题。我使用的是相对路径,它生成了一个额外的 HTTP 请求。
查看我的问题的后续内容和解决方案我试过了(最新的 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');
我在 table 中得到一条记录,其中包含
1,A,1,5
我对您的代码的唯一评论是您应该使用 'static' 而不是 'self'。 ORM 很大程度上依赖于后期静态绑定,因此这可能会导致进一步的问题。它不会引起您的问题,因为它在这里工作正常,而且我在您的代码中看不到任何其他建议。我会首先向它添加一些 Log::info()
调用,然后检查您的日志。也许是某些原因导致您的代码被调用两次?