使用DB :: raw表达式的POINT / POLYGON等的Laravel模型

时间:2014-03-12 18:42:41

标签: php mysql laravel laravel-4 spatial

我有一些使用地理空间字段的模型,例如POINTPOLYGONMULTIPOLYGON。我想告诉我的模型以特殊方式处理这些属性,以便我获得所需的模型属性集。

实施例: 在存储或检索数据库值之前,每个常规Model::find()或其他Eloquent方法都应该应用一些自定义代码。

$area->surface是MySQL中的POLYGON字段,但在我的模型类中,我想将$area->surfare作为一个点数组来处理。

On SELECT我希望1)使用原始表达式获取值以获取值的文本表示,以及2)通过一些自定义PHP代码将WKT字符串转换为数组。

On INSERT/UPDATE我想取属性值(数组)并1)将其转换为WKT字符串,然后2)使用存储的DB原始语句将其写入数据库价值。

我想在现场基础上设置它,而不是为每个字段设置特殊的get / set函数,而不是在控制器中 - 因为我有很多地理空间字段。

有没有办法在Laravel中实现这一目标?

(同一问题的一个更抽象的版本,就是我如何创建操作实际SQL查询的属性值的代码,而不仅仅是通过mutators& accessors进行一些基于值的操作)

更新 深入研究Laravel Doc和API,我发现可能Eloquent::newQuery()方法是我需要操作的?无论是SELECTINSERT还是UPDATE,都可以用于任何查询吗?

3 个答案:

答案 0 :(得分:8)

我们现在已经通过以下功能扩展我们的基本模型来为所有模型解决这个问题:

  • 我们定义了一个包含几何数据的属性数组。
  • 如果我们希望将其作为文本自动加载,我们决定基于每个模型。
  • 我们更改默认查询构建器,以选择几何属性作为数据库中的文本。

以下是我们现在使用的基本模型的摘录:

/**
 * 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);
}

答案 1 :(得分:0)

如果mutators和accessor不符合您的需求,您可以使用Model Events操纵这些属性。

然后,当某些Eloquent事件被触发时,您可以执行代码:创建,创建,更新,更新,保存,保存,删除,删除,恢复,恢复。

答案 2 :(得分:0)

对于所有使用postgres数据库的人,laravel-postgis可用于几何数据