CakePHP:从DB读取模型时,我可以忽略一个字段吗?

时间:2010-06-03 23:16:03

标签: cakephp

在我的一个模型中,我有一个“LONGTEXT”字段,其中包含大量的东西,我从不在乎这些东西,它会减慢速度,因为我在数据库之间移动了更多的数据和网络应用程序。

有没有办法在模型中指定我希望CakePHP简单地忽略该字段,从不读它或用它做任何事情?

我真的想避免为此字段创建单独的表和单独的模型的麻烦。

谢谢!
丹尼尔

4 个答案:

答案 0 :(得分:8)

正如@SpawnCxy所说,您需要使用'fields' => array(...)中的find选项来限制要检索的数据。如果您不想在每次编写find时都这样做,可以在模型beforeFind()回调中添加类似的内容,这会自动填充所有字段的fields选项除了longtext字段:

function beforeFind($query) {
    if (!isset($query['fields'])) {
        foreach ($this->_schema as $field => $foo) {
            if ($field == 'longtextfield') {
                continue;
            }
            $query['fields'][] = $this->alias . '.' . $field;
        }
    }
    return $query;
}

关于评论:

这是真的......在这种情况下,最简单的方法可能是从模式中取消设置字段。

unset($this->Model->_schema['longtextfield']);

我还没有测试过,但是这应该会阻止该字段包含在查询中。如果要对每个查询进行此切换,可以将其移动到另一个变量$Model->_schemaInactiveFields,并在需要时将其移回。你甚至可以为此做一个行为。

答案 1 :(得分:4)

参数fields可能对您有所帮助。它不会忽略字段,但会指定您想要的字段:

array(
'conditions' => array('Model.field' => $thisValue), //array of conditions
'fields' => array('Model.field1', 'Model.field2'), //list columns you want
)

您可以在cookbook中获取有关检索数据的更多信息。

另一个想法

在模型中定义您的特殊查询:

function myfind($type,$params)
{
     $params['fields'] = array('Model.field1','Model.field2',...);
     return $this->find($type,$params);
}

然后在控制器中使用它

$this->Model->myfind($type,$params);

答案 2 :(得分:1)

另外,尝试可包含的行为也会删除所有不需要的字段,也可以处理模型关联。 Containable

class Post extends AppModel {
var $actsAs = array('Containable');
}

其中Post是你的模特

答案 3 :(得分:0)

您可以在表格中添加beforeFilter函数,并为查询添加一个选择

Excample:

public function beforeFind(Event $event, Query $query){

$protected = $this->newEntity()->hidden;

$tableSchema = $event->subject()->schema();

$fields = $tableSchema->columns();
foreach($fields as $key => $name){
    if(in_array($name,$protected)){
        unset($fields[$key]);
    }
}
$query->select($fields);

return $event;

}

在这个例子中,我从ModelClass中取出隐藏字段,从结果中排除。

从我对这里的类似问题的回答中得出结论:Hidden fields are still listed from database in cakephp 3