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

标签 php mysql laravel laravel-4 spatial

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

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

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

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

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

我想在字段基础上设置它,而不是为每个字段设置特殊的获取/设置函数,而不是在 Controller 中 - 因为我有很多地理空间字段。

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

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

更新: 深入研究 Laravel Doc 和 API,我发现也许 Eloquent::newQuery() 方法是我需要操作的?无论是 SELECTINSERT 还是 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);
}

关于php - 使用 DB::raw 表达式的 POINT/POLYGON 等 Laravel 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22360969/

相关文章:

java - 使用已获取的 MySQL 数据行将新的 MySQL 数据附加到 DIV

MySQL查询从不同列中查找数据并在线离线查看

mysql - MySQL 中的 UNION ALL 和 LIMIT

html - 如何在页面加载时使选项卡处于事件状态 -laravel

php - 一些 Laravel 4 PSR-0 问题?

php - 文件获取内容(https ://url) fails

php - 在 IE6 中创建 XMLHTTPRequest

laravel - 使用 laravel 向 whatsapp 发送消息和文件

php - 无法使用 gmail 使用 php 发送电子邮件 - 授权错误

php - 使用 4 个表编写复杂的 SQL 查询