如何在查询中执行语句,以检查是否存在查询 ID 为名称且 laravel 中资源较少的文件


How to perform a statement inside a query to check existence of a file that has the query id as name with less resources in laravel

我正在寻找查询"id"是否有与文件系统中名称相同的ID的文件夹,我做到了,但它会减慢驱动器的速度,

将来有很多文件
$query = Model::all();
if(Input::get('field') == 'true'){
   $filenames = scandir('img/folders');
   $query->whereIn('id', $filenames);
}

如您所见,这将扫描并获取"文件夹"目录中所有文件夹的名称并使用它创建一个数组,现在我的应用程序将来将拥有数十万个文件夹,我想在它发生之前解决它,感谢您的进一步帮助

PS:欢迎其他不同做法的提议

您是否有充分的理由相信具有大量文件夹的目录上的 scandir 实际上会减慢您的速度?

您可以像这样执行查询:

if(Input::has('field')){
   $filenames = scandir('img/folders');
   $query = Model::whereIn('id', $filenames)->get();
}

编辑 1

您可能会发现这些链接很有用:

PHP: scandir() 太慢了

获取目录中的文件

编辑 2

链接中有一些非常好的建议,您应该能够使用这些建议作为指导来进行自己的实现。在我看来,根据我所做的第一次编辑中包含的链接,您的选项是使用 DirectoryIteratorreaddir 或带有 scandir 的分块。

这是一种非常基本的方法,但我想你可以像这样用 readdir 做一些事情:

$ids = Model::lists('id');
$matches = [];
if($handle = opendir('path/to/folders'))
{
    while (($entry = readdir($handle)) !== false) 
    {
        if(count($ids) === 0)
        {
            break;
        }
        if ($entry != "." && $entry != "..") 
        {
            foreach ($ids as $key => $value) 
            {
                if($value === $entry)
                {
                    $matches[] = $entry;
                    unset($ids[$key]);
                }
            }
        }
    }
    closedir($handle);
}
return $matches;