Php 使用DB::raw表达式的具有点/多边形等的Laravel模型
我有一些使用地理空间字段的模型,如Php 使用DB::raw表达式的具有点/多边形等的Laravel模型,php,mysql,laravel,laravel-4,spatial,Php,Mysql,Laravel,Laravel 4,Spatial,我有一些使用地理空间字段的模型,如点、多边形或多多边形。我想告诉我的模型以一种特殊的方式处理这些属性,以便获得所需的模型属性集 例如: 每个常规的Model::find()或其他有说服力的方法都应该在存储或检索数据库值之前应用一些自定义代码 $area->surface是MySQL中的一个多边形字段,但在我的模型类中,我希望将$area->surfare作为点数组处理 因此,在SELECT上,我想1)使用原始表达式获取值,以获取值的文本表示形式,2)通过一些自定义PHP代码将WKT字符串转换为数
点
、多边形
或多多边形
。我想告诉我的模型以一种特殊的方式处理这些属性,以便获得所需的模型属性集
例如:
每个常规的Model::find()
或其他有说服力的方法都应该在存储或检索数据库值之前应用一些自定义代码
$area->surface
是MySQL中的一个多边形
字段,但在我的模型类中,我希望将$area->surfare
作为点数组处理
因此,在SELECT
上,我想1)使用原始表达式获取值,以获取值的文本表示形式,2)通过一些自定义PHP代码将WKT字符串转换为数组
在INSERT/UPDATE
上,我想获取属性值(一个数组)并1)将其转换为WKT字符串,然后2)使用存储该值的DB raw语句将其写入数据库
我想在字段的基础上设置它,而不是作为每个字段的特殊get/set函数,也不是在控制器中,因为我有许多geosptial字段
在Laravel有没有办法做到这一点?
(同一个问题的一个更抽象的版本是,我如何创建代码来操纵实际SQL查询的属性值,而不仅仅是通过mutator和accessor进行一些基于值的操纵)
更新:
深入研究Laravel文档和API,我发现可能我需要操作的是
elount::newQuery()
方法?无论是选择
、插入
还是更新
,都会用于任何查询吗?如果变量和访问器不符合您的需要,您可以使用操作这些属性
然后,当一些有说服力的事件被触发时,您可以执行代码:创建、创建、更新、更新、保存、保存、删除、删除、还原、还原。我们现在通过以下功能扩展我们的基本模型,为所有模型解决了这一问题:
- 我们定义了一个包含几何数据的属性数组
- 我们决定在每个模型的基础上,如果我们希望这是自动加载为文本
- 我们更改默认的查询生成器,以从数据库中选择作为文本的几何体属性
/**
* The attributes that hold geometrical data.
*
* @var array
*/
protected $geometry = array();
/**
* Select geometrical attributes as text from database.
*
* @var bool
*/
protected $geometryAsText = false;
/**
* Get a new query builder for the model's table.
* Manipulate in case we need to convert geometrical fields to text.
*
* @param bool $excludeDeleted
* @return \Illuminate\Database\Eloquent\Builder
*/
public function newQuery($excludeDeleted = true)
{
if (!empty($this->geometry) && $this->geometryAsText === true)
{
$raw = '';
foreach ($this->geometry as $column)
{
$raw .= 'AsText(`' . $this->table . '`.`' . $column . '`) as `' . $column . '`, ';
}
$raw = substr($raw, 0, -2);
return parent::newQuery($excludeDeleted)->addSelect('*', DB::raw($raw));
}
return parent::newQuery($excludeDeleted);
}
对于所有使用postgres数据库的人来说,可以用于几何数据我理解观察者的方式是,我通过了模型实例,这并不是我真正想要的。我想要一种方法,将SELECT、INSERT和UPDATE上执行的SQL注入,以操纵某个字段的读写方式。例如,对于多边形,我希望任何SELECT在通过模型触发的任何SELECT操作中始终使用
DB::raw('AsText(polygon)as polygon')
。我刚刚尝试了这一点,在选择列(返回多边形((98.07 30.12,-98.07 30.53等))时,它几乎与预期的效果一样。您介意分享一下您是如何处理PHP数组作为输入的吗?