2

我正在尝试进行左连接选择并使用 AND 将列与特定值(即条件)进行比较。

问题是我不知道在哪里添加条件。下面的 medoo 查询返回相同用户 ID 的第一个衬衫 ID,即使所有 'is_wearing_shirt' 设置为 0。然而,常规 mysql 查询返回预期数据。

这是medoo查询:

$db->select('users', array(
    '[>]shirts' => array(
        'user_id' => 'shirt_owner_id',
        'is_wearing_shirt' => 1 // equivalent to AND is_wearing_shirt = 1
    )
), array(
    'user_id',
    'shirt_id(shirt_id_being_worn)'
) , array(
    'user_id' => 1,
    'LIMIT' => 1
));
// always returns a shirt_id (even if all rows have is_wearing_shirt set to 0, in which case, shirt_id should be null)

这是有效的常规 MySQL 查询:

SELECT u.user_id, s.shirt_id
FROM  `cvs_users` u
LEFT JOIN `shirts` s
    ON user_id = shirt_owner_id
    AND shirt_being_worn = 1
WHERE user_id = 1
//returns the correct shirt_id
4

2 回答 2

2

medoo 库 (medoo 0.9.6.2) 目前不支持在 join 子句中使用 AND/OR 连接逻辑表达式。只能使用query($query)medoo给出的方法直接执行sql查询。对于您的示例,查询如下所示:

$data = $db->query("SELECT u.user_id, s.shirt_id FROM `cvs_users` u 
    LEFT JOIN `shirts` s 
    ON user_id = shirt_owner_id AND shirt_being_worn = 1 
    WHERE user_id = 1")->fetchAll();

注意最后的调用以fetchAll()获取查询的数据。我遇到了同样的问题,调试 medoo.php 代码发现 AND/OR 条件仅在 where 子句中考虑。也许他们会将这个功能放在未来的更新中。我已经开始了一个描述问题的问题:Medoo Issue

于 2014-11-03T14:18:57.467 回答
2

我提交了一个拉取请求,试图解决这个问题:https ://github.com/catfan/Medoo/pull/206

我所做的是更改 medoo.php 行 564-568

// For ['column1' => 'column2']
else
{
    $relation = 'ON ' . $table . '."' . key($relation) . '" = "' . (isset($match[5]) ? $match[5] : $match[3]) . '"."' . current($relation) . '"';
}

// For ['column1' => 'column2']
else
{
    $and_relation = 'ON ' . $table . '."' . key($relation) . '" = "' . (isset($match[5]) ? $match[5] : $match[3]) . '"."' . current($relation) . '"';
    // if there is more than one condition
    if (count($relation) > 1) {

        // remove the "ON" part
        array_shift($relation);

        // add the condition to the join
        foreach ($relation as $key => $value) {
            // if the [$] value modifier is present
            if (preg_match('/\[\${1}\]/', $key) === 1) {
                $key = preg_replace('/\[\${1}\]/', '', $key);
                $and_relation .= ' AND "' . (isset($match[5]) ? $match[5] : $match[3]) . '"."' . $key . '" = ' . $value;
                continue;
            }
            // add additional table_relation
            $and_relation .= ' AND ' . $table . '."' . $key . '" = "' . (isset($match[5]) ? $match[5] : $match[3]) . '"."' . $value . '"';
        }
    }

    // write our new relation back
    $relation = $and_relation;
}

笔记:

如果添加是连接表的值,请使用修饰符[$]: 'right_table_column[$]' => value。如果该值是一个字符串,则必须在将其传递给连接数组之前对其进行引用,例如

// $db = Medoo Object
$value = $db->quote('myString');

$db->select(['table',
    [
        '[>]right_table' => [
            'join_condition' => 'join_condition', // ON
            'additional_condition[$]' => $value, // AND
            ],
    ],
    [
        ...where conditions...
    ]
]); 

如果它是表关系,则将其用作任何其他连接条件'left_table_column' => 'right_table_column'

于 2015-02-25T12:51:54.827 回答