我的模型定义如下:
class User extends ActiveRecord\Model {
function get_name() {
return $this->first_name . " " . $this->surname;
}
}
然而,当我显示$item->attributes();
时,名称不会出现。我在这里是个白痴吗?如果是这样,我如何将自定义属性添加到模型中?
谢谢, 加雷
答案 0 :(得分:1)
attributes()方法确实只返回模型表列的值(没有别名)。
但是$item->name
应该会给你预期的结果。您还可以添加setter。
要获取所有属性的数组,可以将此方法添加到模型中:
public function all_attributes() {
$custom_attr = [];
foreach (static::$getters as $getter) {
$key = substr($getter, 4);
$custom_attr[$key] = $this->$key;
}
return $custom_attr + $this->attributes();
}
(不要忘记将你的getter添加到$ getters数组,ActiveRecord模型将使用它)
答案 1 :(得分:1)
这是我的简单解决方案。我已经覆盖了属性方法并添加了以“get_attribute_”开头的所有方法,因此我可以在序列化过程中使用它们:
class BaseModel extends ActiveRecord\Model
{
public function attributes()
{
$attrs = parent::attributes();
$modelReflector = new ReflectionClass(get_class($this));
$methods = $modelReflector->getMethods(~ReflectionMethod::IS_STATIC & ReflectionMethod::IS_PUBLIC);
foreach ($methods as $method)
{
if (preg_match("/^get_attribute_/", $method->getName()))
{
$attrs[str_replace('get_attribute_', '', $method->getName())] = $method->invoke($this);
}
}
return $attrs;
}
}
使用它的结果模型如下所示:
class User extends BaseModel
{
public $loginSessionId;
function get_attribute_loginSessionId(){
return $this->loginSessionId;
}
}
通过这种方式,我可以手动添加loginSessionId(或我想要的任何其他内容)并将其显示在序列化值中。
答案 2 :(得分:0)
您必须检查属性功能的作用。 您可能需要覆盖它以考虑您的自定义属性,或者您可能必须将自定义属性添加到祖先中的某个_properties属性
答案 3 :(得分:0)
你能告诉我们你是如何创造$ item的吗? PHPActiveRecord需要您在构造函数调用(new User($attributes)
)中或直接在属性($user->first_name = 'Gareth'
)上设置属性。
修改
我不确定attributes()方法是否会获取自定义getter。它似乎只返回模型的attributes属性。
https://github.com/kla/php-activerecord/blob/master/lib/Model.php#L566
答案 4 :(得分:0)
我解决了这个问题如下:
创建一个派生自ActiveRecord\Model
的类并包含此函数:
public function properties()
{
$attrs = $this->attributes();
$modelReflector = new ReflectionClass(get_class($this));
$methods = $modelReflector->getMethods(~ReflectionMethod::IS_STATIC & ReflectionMethod::IS_PUBLIC);
foreach ($methods as $method)
{
if (preg_match("/^get_/", $method->getName()))
{
$attrs[str_replace('get_', '', $method->getName())] = $method->invoke($this);
}
}
return $attrs;
}
只要我从正确的类(而不是ActiveRecord\Model
)派生我的模型,这将返回所有属性,自定义或其他属性。
答案 5 :(得分:0)
实际上,它可以像这样轻松实现@将其添加到https://github.com/kla/php-activerecord/blob/master/lib/Model.php#L520:
// check for attribute as getter
if ( method_exists( $this, "get_{$name}" ) ){
$method = "get_{$name}";
$var = $this->$method();
return $var;
}
但我更喜欢这样做(更干净/优化的代码):
SomeModel.php:
/**
* gets templatefile of outputplugin, wrapper function for template comfortability
*
* NOTE 2: never implement functions in model, try redirecting
* to manager class (=lowmemory footprint, imagine xxxxx models with xxxx similar functions)
*
* @param string $varname variable description
* @return string
*/
public function get( $varname )
{
switch( $varname ){
case "foo" : return SomeModel::getManager()->getFoo(); break;
default: return "";
}
}
将其添加到https://github.com/kla/php-activerecord/blob/master/lib/Model.php#L520:
// check for attribute as getter
if ( method_exists( $this, "get" ) && $this->get( $name ) ){
$var = $this->get( $name );
return $var;
}