pre*_*eyz 8 php mysql spatial laravel laravel-4
我有一个使用像地理空间领域的一些车型POINT,POLYGON或MULTIPOLYGON.我想告诉我的模型以特殊方式处理这些属性,以便我获得所需的模型属性集.
示例:每个常规Model::find()或其他Eloquent方法应在存储之前或检索数据库值之后应用一些自定义代码.
$area->surface是POLYGONMySQL中的一个字段,但在我的模型类中,我想$area->surfare作为一个点数组来处理.
在SELECT因此,我要像1)使用原始表达式来获取值的文本表示获取值,和2)通过一些自定义的PHP代码到WKT字符串转换成一个数组.
在INSERT/UPDATE我想取属性值(数组)和1)将其转换为WKT字符串,然后2)使用存储该值的DB原始语句将其写入数据库.
我想在一个字段的基础上设置它,而不是作为每个字段的特殊get/set函数,而不是在控制器中 - 因为我有许多地理空间字段.
有没有办法在Laravel实现这一目标?
(同一个问题的一个更抽象的版本,就是我如何创建操作实际SQL查询的属性值的代码,而不仅仅是通过mutators和accessors进行一些基于值的操作)
更新:
深入了解Laravel Doc和API,我发现这个Eloquent::newQuery()方法可能是我需要操作的吗?这会用于任何查询,无论是否SELECT,INSERT或UPDATE?
我们现在已经通过以下功能扩展我们的基本模型来为所有模型解决这个问题:
以下是我们现在使用的基本模型的摘录:
/**
* 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4934 次 |
| 最近记录: |