AFAIK không có chức năng như vậy, nhập các lớp và chọn nội dung mệnh đề không bao giờ đụng đến.
Nếu bạn muốn áp dụng điều này cho tất cả các tìm kiếm, thì bạn có thể sử dụng Model.beforeFind()
chẳng hạn sự kiện, xem qua select
mệnh đề và biến đổi các trường thành biểu thức. Đây là một ví dụ nhanh và dễ hiểu, trong đó field
là tên của POLYGON
loại cột:
// in the respective table class
use Cake\Event\Event;
use Cake\ORM\Query;
// ...
public function beforeFind(Event $event, Query $query, \ArrayObject $options, $primary)
{
$query->traverse(
function (&$value) use ($query) {
if (empty($value)) {
$value = $query->aliasFields($this->getSchema()->columns());
}
foreach ($value as $key => $field) {
if (is_string($field) &&
$this->aliasField($field) === $this->aliasField('field')
) {
unset($value[$key]);
$value[key($query->aliasField($field))] = $query->func()->AsText([
$this->aliasField('field') => 'identifier'
]);
}
}
},
['select']
);
}
Bạn có thể phải tính đến $field
cũng như các biểu thức, trong trường hợp trường có thể được sử dụng trong một và cũng cần được chuyển đổi ở đó.
Một cách khác là chuyển đổi dữ liệu ở cấp độ PHP trong lớp kiểu 'toPHP()
, như đã được chỉ ra trong ví dụ mã của bạn.
Xem thêm
- Sách dạy nấu ăn> Truy cập cơ sở dữ liệu &ORM> Đối tượng bảng> Gọi lại vòng đời> trước Tìm kiếm
- API> \ Cake \ Database \ Truy vấn ::traverse ()