我现在正在使用php-activerecord一段时间,我非常喜欢它.Php-activerecord是一个基于ActiveRecord模式的开源ORM库.但是,我最近尝试将它与基于Wrench的websocket应用程序结合使用.
这非常有效但是为了启动脚本,应用程序必须作为linux上的守护进程运行才能使websocket始终处于可用状态.在不使用应用程序然后尝试再次使用它之后,它会抛出一些数据库异常:
起初它会发出警告:
PHP Warning: Error while sending QUERY packet. PID=XXXXX in /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Connection.php on line 322
Run Code Online (Sandbox Code Playgroud)
然后它抛出一个致命的错误:
PHP Fatal error: Uncaught exception 'ActiveRecord\DatabaseException' with message 'exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2006 MySQL server has gone away' in /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Connection.php:322
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
#0 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Connection.php(322): PDOStatement->execute(Array)
#1 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Table.php(218): ActiveRecord\Connection->query('SELECT * FROM ...', Array)
#2 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Table.php(209): ActiveRecord\Table->find_by_sql('SELECT * FROM `...', Array, false, NULL)
#3 /home/user/domains/example.com/public_html/vendor/php-activerecord/php-activerecord/lib/Model.php(1567): ActiveRecord\Table->find(Array)
#4 in /home/user/domains/example.com/public_html/vendor/php-activerecord/lib/Connection.php on line 325
Run Code Online (Sandbox Code Playgroud)
似乎php-activerecord一直保持mysql连接在websocket服务器运行时保持打开状态,如果它自动尝试重新连接并再次运行查询,那么这个问题应该不是问题.但它没有.
我读过有关设置的内容MYSQL_OPT_RECONNECT.但我不确定这是否有效或如何使用php-activerecord设置该选项.这里有人有这方面的经验吗?
编辑:这是我的全局超时配置变量 …
我有一个数据库,我想只拉出某些日期在指定范围内的行.我不确定如何在活动记录中正确地做到这一点.现在看起来我正在活动记录查询中运行标准的mysql查询.我希望这可以让你了解我在寻找什么.
我希望能够在今天之前获得任何行,包括今天和未来3天.
$query = $this->db->query("SELECT * FROM 'topics_list' . 'topic date' WHERE DATE(order_datetime) BETWEEN '2012-10-01' AND '2012-10-3'");
Run Code Online (Sandbox Code Playgroud) 我想有一个简单的方法,可以将PHP Activerecord结果作为简单/关联数组,而不是ActiveRecord对象数组.
在Ruby中,我相信这可能是通过.map()方法完成的.(我不是红宝石家伙...)
我想要的是一个简单的方法调用,比如toArray()在Zend_DB_Table中,不是foreach,或类似的东西,但我似乎无法在他们的文档中找到它.
在PHP ActiveRecord中获取结果非常简单:
$settings = SystemSettings::all();
Run Code Online (Sandbox Code Playgroud)
但它给出了这样的东西:
[0] => SystemSettings Object
(
[errors] =>
[attributes:ActiveRecord\Model:private] => Array
(
[param] => author
[value] => Hawle
)
[__dirty:ActiveRecord\Model:private] => Array
(
)
[__readonly:ActiveRecord\Model:private] =>
[__relationships:ActiveRecord\Model:private] => Array
(
)
[__new_record:ActiveRecord\Model:private] =>
)
[1] => SystemSettings Object
(
[errors] =>
[attributes:ActiveRecord\Model:private] => Array
(
[param] => base_url
[value] => example.com
)
[__dirty:ActiveRecord\Model:private] => Array
(
)
[__readonly:ActiveRecord\Model:private] =>
[__relationships:ActiveRecord\Model:private] => Array
(
)
[__new_record:ActiveRecord\Model:private] …Run Code Online (Sandbox Code Playgroud) 我正在拿起PHP Active Record并处理关联.我有两个相关对象使用"Has_Many"和"Belongs_to"(父/子)并尝试在创建新父记录时创建子记录(在这种情况下为我的"单位"创建"皮肤").
class Unit extends ActiveRecord\Model
{
static $has_many = array(
array('skins')
);
}
class Skin extends ActiveRecord\Model
{
static $belongs_to = array(
array('unit')
);
}
Run Code Online (Sandbox Code Playgroud)
我在这里找到了这两个主题: http: //www.phpactiverecord.org/boards/4/topics/153 Activerecord-association:创建新对象(查找类)
所以我的代码目前看起来像:
$unit = new Unit();
$unit->name = 'somename';
$unit->description = 'somedescription';
$skinArray = array('name' => $unit->name.' Default Skin');
$unit->create_skins($skinArray);
$unit->save();
Run Code Online (Sandbox Code Playgroud)
上面的代码没有将新皮肤与数据库中的单元或代码相关联,尽管它/是/在数据库中放置一个新的皮肤记录(unit_id为NULL).使用"build_skins"不会在数据库中放入Skin记录.
我希望有一种方法可以通过模型本身向父模型添加"子",就像其他ORM一样.我能做到这一点的唯一方法就是明确地做到这一点:
$unit = new Unit();
$skin = new Skin();
$unit->name = 'somename';
$unit->description = 'somedescription';
$unit->save();
$skin->unit_id = $unit->id;
$skin->name = $unit->name.' Default Skin';
$skin->save();
Run Code Online (Sandbox Code Playgroud)
也许这就是它应该在PHP ActiveRecord中完成的方式,我的期望是错误的.但我希望有一种方法可以通过不需要首先使用显式调用将父节点保存到DB的对象来实现.例如,"Recess"PHP框架可以在单元上进行简单的调用,如:$ unit-> …
我正在使用一个应用程序,它使用phpActiveRecord和mySQL从传感器网络中提取数据并将其绘制到客户端上的一些flot.js图表上.
用户可以选择几个时间帧来影响图形显示的数据范围. 2hrs, 24hrs, 3 days and 1 week.
传感器每隔60秒发布到数据库,因此在绘制图形时,查询会在所有行之间拉入now and DATE_SUB(CUR_DATE - INTERVAL ? DAY)?是1,3或7等
但是,这会导致返回大量行,(60,000 + for the full week!)并导致巨大的延迟和服务器错误.
我知道我可以大量增加php.ini文件中可用于查询的最大内存,但这不是一个好的解决方案,并且无法解决速度问题.
我的问题是,有没有一种方法可以根据用户希望查看的间隔长度,轻松选择所需日期范围内的每一秒或第三行?
在C或Java中,我会做一些像模数选择来返回备用行但我想不出在当前框架中执行此操作的方法.
任何想法,将不胜感激.谢谢.
在我的控制器中,我设置以下变量并将它们传递给Twig模板:
$data = $model::all(); // returns object [phpactiverecord]
$fields = getFields(); // returns associative array
Run Code Online (Sandbox Code Playgroud)
在我的模板中,我试图像这样访问它们:
{% block rows %}
{% for row in data %}
<tr>
{% for field in fields %}
<td>{{ row[field.name] }}</td>
{% endfor %}
</tr>
{% endfor %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,$ fields定义为:
Array
(
[0] => Array
(
[name] => id
[display] => Id
)
[1] => Array
(
[name] => name
[display] => Name
)
)
Run Code Online (Sandbox Code Playgroud)
和$ data是一个phpactiverecord对象的数组.
如上所述,row [field.name]没有输出任何内容.
如果我更改row [field.name],我会看到以下结果:
row.name …Run Code Online (Sandbox Code Playgroud) 什么是搜索字段的好方法,忽略搜索词和字段中的空格?
例:
SELECT *
FROM tablename
WHERE NOSPACES(fieldname) LIKE '%{search term with spaces removed}%'
Run Code Online (Sandbox Code Playgroud)
现实世界的例子:
我的客户有一个销售长块发动机的网站.然而,他们经常让人们在他们的网站上搜索"cat 3306 longblock "(而不是"cat 3306 long block").当搜索"longblock"时,我们需要显示"长块"引擎.
注意:对于这个问题,它可能无关紧要,但是这个网站是使用PHP 5.3和phpActiverecord构建的.
当尝试使用phpActiveRecord在表中创建记录时,我收到以下错误:
Invalid datetime format: 1292 Incorrect datetime value: '2013-06-20 11:59:08 PDT' for column 'created_at'
正在运行的代码:
$new_cart = new QuoteRequest();
$new_cart->status = "cart";
$new_cart->save();
Run Code Online (Sandbox Code Playgroud)
我已将其跟踪到phpActiveRecord中的相关行.文件Connection.php,第55-59行:
/**
* Database's datetime format
* @var string
*/
static $datetime_format = 'Y-m-d H:i:s T';
Run Code Online (Sandbox Code Playgroud)
使用它的行(Connection.php,第457-466行):
/**
* Return a date time formatted into the database's datetime format.
*
* @param DateTime $datetime The DateTime object
* @return string
*/
public function datetime_to_string($datetime)
{
return $datetime->format(static::$datetime_format);
}
Run Code Online (Sandbox Code Playgroud)
转换值的位置(Table.php第394-412行):
private function &process_data($hash)
{
if (!$hash)
return $hash; …Run Code Online (Sandbox Code Playgroud) 我的sparks安装使用我的codeigniter安装时遇到问题
以下是我采取的步骤如下:
我codeigniter通过我的项目文件夹的根目录PHPCLI使用以下命令安装sparks
php -r "$(curl -fsSL http://getsparks.org/go-sparks)"
Run Code Online (Sandbox Code Playgroud)我使用下面的spark命令安装了活动记录库
php tools\spark install -v0.0.2 php-activerecord
Run Code Online (Sandbox Code Playgroud)2A.这个命令给了我下面的文件夹结构
-application
-sparks
-php-activerecord
-0.0.2
-config
-variables
-vendor
-system
-tests
-tools
-lib
-spark
-sparktypes
-test
-user_guide
Run Code Online (Sandbox Code Playgroud)
2B.此命令生成一个sparks包含php active record文件夹,用于构成必要的组件php-activerecord,使用该命令生成一个如下所示的MY_Loader.php文件
<?php if (! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Sparks
*
* An open source application development framework for PHP 5.1.6 or newer
*
* @package CodeIgniter
* @author …Run Code Online (Sandbox Code Playgroud) 从使用phpactiverecord http://www.phpactiverecord.org/,有没有办法看到调试生成的SQL查询,比查看数据库服务器的查询日志等?
我有三个模型:
// student_id student_name
Student extends ActiveRecord\Model
{
static $has_many = array(
array('studentcourses')
);
}
// course_id course_name
Course extends ActiveRecord\Model
{
static $has_many = array(
array('students')
);
}
// course_id student_id
Studentcourse extends ActiveRecord\Model
{
static $belongs_to = array(
array('student')
);
}
Run Code Online (Sandbox Code Playgroud)
因此,通过这样做,我将能够轻松地从这些表中检索数据:
$student = Student::find(1);
foreach ($student->studentcourses as $course)
{
echo $course->name;
}
Run Code Online (Sandbox Code Playgroud)
但是为了输入'studentcourses',我想输入 $student->courses 来获取学生参加的所有课程,并输入 $course->students 来获取特定课程的学生列表。关系设置看起来如何才能做到这一点?
我正在尝试测试php-activerecord,它有一些测试.运行时:
phpunit sometestname
没啥事儿.我检查了代码,
include 'helpers/config.php';
require_once dirname(__FILE__) . '/../lib/Inflector.php';
class InflectorTest extends SnakeCase_PHPUnit_Framework_TestCase
{
public function set_up()
{
$this->inflector = ActiveRecord\Inflector::instance();
}
public function testOne()
{
$this->assertTrue(2+2==4);
}
Run Code Online (Sandbox Code Playgroud)
任何的想法?

php ×12
phpactiverecord ×12
mysql ×6
activerecord ×1
codeigniter ×1
flot ×1
javascript ×1
phpunit ×1
slim ×1
twig ×1
wrench ×1