0

我正在 Idiorm 和 Paris 中寻找以下 SQL 等效项:

SELECT * FROM table WHERE (regex=0 AND col=_match_) OR (regex=1 AND _match_ REGEXP col)
LIMIT 1

以下 Idiorm & Paris 语句仅匹配col=_match_

成语:

$row = ORM::for_table('table')
->where_equal('col', '_match_')
->find_one()

巴黎:

MyModel::where('col', '_match_')->find_one()
4

2 回答 2

3

句子 where_any 是该示例的解决方案:

$myModel = ORM::for_table('table')
        ->where_any_is(array(
            array('regex'=> 0,'col' => 'match'),
            array('regex'=> 1,'col' => '_match_')))
        ->limit(1)->find_many();

有关过滤查询,请参阅官方文档:https ://idiorm.readthedocs.org/en/latest/querying.html#filtering-results

于 2015-09-04T14:08:31.483 回答
1

阅读文档和代码后,似乎 Idiorm/Paris 不支持该功能。所以,我们有两个选择:

  1. 使用where_raw()方法,通过这种方式,我们将把 where 子句作为字符串直接传递给 Idiorm。

  2. 添加一个新方法,如where_condition()Idiorm ORM 类,通过设置将 $value 与 $column_name 匹配$reverse = true,否则,这是一个正常的 where 条件(匹配 $column_name 与 $value)。

    public function where_condition($column_name, $operator, $value, $reverse = false)
    {
    $multiple = is_array($column_name) ? $column_name : array($column_name => $value);
    $result = $this;
    
    foreach($multiple as $key => $val) {
        // Add the table name in case of ambiguous columns
        if (count($result->_join_sources) > 0 && strpos($key, '.') === false) {
            $table = $result->_table_name;
            if (!is_null($result->_table_alias)) {
                $table = $result->_table_alias;
            }
    
            $key = "{$table}.{$key}";
        }
        $key = $result->_quote_identifier($key);
    
        if($reverse)
            $result = $result->_add_condition('where', "? {$operator} {$key}", $val);
        else
           $result = $result->_add_condition('where', "{$key} {$operator} ?", $val); 
    }
    return $result;
    
    }
    
于 2015-09-04T16:33:50.333 回答