【问题标题】:How to skip a row with file exists condition in laravel如何在laravel中跳过文件存在条件的行
【发布时间】:2015-08-29 13:30:37
【问题描述】:

这是基于许多输入字段的搜索查询,我正在根据输入在查询中执行 if 语句,例如:

$query = Model::all();

if($field = Input::get('field'))
        $query->where('column_name', $field);

但我想做的还有一个条件是如果没有具有该行 id 名称的图像则跳过一行,如下所示:

if( file_exists('/img/'.$this_query->id) )
        $query->skip();

【问题讨论】:

    标签: laravel search eloquent


    【解决方案1】:

    选项 1:将创建一个文件名数组,然后使用 whereIn 查询构建器方法,该方法检查数组中是否出现列值。

    $query = Model::query();
    
    $filenames = scandir('/img');
    
    // the following excludes any id's not in the $filenames array
    $query = $query->whereIn('id', $filenames);
    

    选项 2:运行查询,然后在 Laravel 中运行 filter 生成的集合。

    $query = Model::query();
    // ... then build up your query
    
    // the following gets the query results and then filters them out
    $collection = $query->get()->filter( function($item) {
        return file_exists('/img/'.$item->id);
    }
    

    基本原理:数据库在处理过程中无法检查文件系统;因此,您要么需要(选项 1)为其提供要检查的列表,要么(选项 2)在您 get() 查询返回的结果之后进行检查。

    【讨论】:

    • 目前正在工作,谢谢 :) ,现在我不知道这个 scandir() 函数是否会使用大量资源并在网站有流量时减慢网站速度
    • 还有一个问题,有没有办法在不获取所有文件名的情况下检查文件是否存在?只有具有特定 id 的那个?例如:$filenames = scandir('/img/'.$id);
    • 我对 scandir() 的性能不是很熟悉,但我猜它可能是 n(number_of_files),即更多地依赖于要扫描的文件数量,如果你有数百个文件。您知道在进行查询之前需要检查的 id 吗?您一次只查询一个ID吗?还是要检查一组ID?我会用一些替代解决方案更新答案。
    • 你让我大开眼界,因为 mysql 在读取表时无法检查文件系统,stackoverflow.com/questions/17192827/…,我需要在查询时检查而不是之后,所以我将使用包含文件夹名称的缓存数组来执行此操作,然后编辑该文件夹上的每个 CRUD 表,我猜它在处理大量请求和文件时的性能会更好?
    猜你喜欢
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多