为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Laravel Eloquent 通过第三方“代理”查询 SQLite

使用 Laravel Eloquent 通过第三方“代理”查询 SQLite

PHP
不负相思意 2022-10-14 10:40:42
我正在尝试使用 Laravel Eloquent 查询(可选操作)SQLite 数据库。为此已经存在一个驱动程序,并且非常易于使用。然而,该数据库是远程的并且是视频游戏的一部分。游戏支持 RCON,它允许我发送命令,在这种情况下,我可以发送 SQL 语句。我现在的状态:通过第三方库向远程机器发送以“sql”为前缀的 SQL 语句:sql SELECT id, level, guild, isAlive FROM characters接收以记录号为前缀的行分隔字符串:     id |  level |  guild |  isAlive |#0 1183 |     14 |     60 |        1 |#1  636 |     10 |     60 |        1 |#2   41 |     30 |     60 |        1 |#3   47 |     27 |     60 |        1 |#4   49 |     38 |     60 |        1 |#5  403 |     32 |     60 |        1 |#6   50 |     31 |     60 |        1 |#7 1389 |     44 |     60 |        1 |以特别令人讨厌的方法逐行解析输出,然后手动将它们分配给自定义构建的模型/类。我真的很想以任何身份合并 Eloquent,而不是使用我自己的自定义类。当我打出这篇文章时,我意识到我不相信我能够“搭载”现有的 SQLite 驱动程序,而这很可能是一个全新的驱动程序。但是,对于那些比我更有经验的人,您对处理这种情况有什么建议或方法吗?
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

最终,我处理了 RCON 命令的输出。缺点是它特别静态。我必须围绕诸如使用 SQL 语句选择的列并将结果调整为适当的类型等内容进行构建。

我正在使用https://github.com/gorcon/rcon-cli并围绕它包装了一个查询类:

class RconDatabase

{

    const RCON_EXECUTABLE = __DIR__ . '/../bin/rcon';


    public function __construct()

    {


    }


    public function query($sql)

    {

        if (!is_executable(self::RCON_EXECUTABLE)) throw new FilePermissionException('Unable to execute RCON');


        $cmd = self::RCON_EXECUTABLE.' -a '.Config::get('rcon.host').':'.Config::get('rcon.port').' -p '.Config::get('rcon.password').' -c "sql '. $sql .'"';

        $output = shell_exec($cmd);


        if ($output == null) throw new RconConnectionException('No response from RCON server');

        if (strpos($output, 'authentication failed') !== false) throw new RconAuthenticationException();

        if (strpos($output, 'dial tcp') !== false) throw new RconNetworkException();


        $lines = preg_split("/((\r?\n)|(\r\n?))/", $output);


        $results = array();

        $last_column = 0;

        for ($i = 0; $i < count($lines); $i++) {

            if (empty($lines[$i])) continue;


            $columns = str_getcsv($lines[$i], '|');


            for ($x = 0; $x < count($columns); $x++) {

                if ($i == 0 && empty($columns[$x])) {

                    $last_column = $x;

                    continue;

                }


                if ($x == 0 && preg_match('/^#[0-9]+\s+(\S+)/', $columns[0], $match))

                    $columns[$x] = $match[1];


                $columns[$x] = trim($columns[$x]);

            }


            if ($i == 0) continue;


            if ($last_column > 0) unset($columns[$last_column]);


            array_push($results, $columns);

        }


        return $results;

    }

}



查看完整回答
反对 回复 2022-10-14
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信