【问题标题】:Performing image search with tags使用标签执行图像搜索
【发布时间】:2014-03-18 09:27:20
【问题描述】:

您好,我有一个数据库,但似乎无法想出在我的项目中搜索图像的技术,我的数据库结构如下所示。

图片表

image_id (PK) |类别 |拇指 |预览 |作者

图片标签表

img_id (FK) |标签名

整个想法是当用户填写文本框并点击回车时,我的 php 脚本使用explode函数将请求的值通过空格转换为数组,然后在搜索时遍历每个找到的值在数据库(图像标签表)上找到一个标签名称,其值类似于请求并加入图像表,其中 (FK) 等于 (PK)。

我实际上正在寻找一种更有效和可行的方法来做我的

这是我的代码(php/query)。

   $keywords = Input::get("keywords");

   $keywordsExploded = explode(" ", $keywords);

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

        $searchKey = $keywordsExploded[$i];

        $search = DB::table('image_tags')
                    ->leftJoin('images', 'images.image_id', '=', 'img_id')
                    ->where('tag_name','like','%'.$searchKey.'%')
                    ->get();

        $imageResult[] = $search;
    }

    $imageResult = array_map('unserialize', array_unique(array_map('serialize', $imageResult)));

这是我 var dump 时的输出。

大批 ( [0] => 数组 ( [0] => 标准类对象 ( [img_id] => 8045eb05de1f6b72824f2bfd2fc972c1 [tag_name] => 好女孩 [image_id] => 8045eb05de1f6b72824f2bfd2fc972c1 [类别] => 家庭 [许可证] => 有限效用 (LU) [作者] => 丹尼尔·巴德 [拇指] => 资产/下载/img/thumb/2413759e3bdebf51b8bf215bc82018d4_thumb.jpg [prv] => 资产/下载/img/prv/00eead497c552ab309ab66294cf5c758_P.jpg [date_uploaded] => 01 - 23 - 2014 [time_uploaded] => 1390517578 [search_id] => 1390513134 [使用政策] => ) [1] => 标准类对象 ( [img_id] => c57d2e6f501670487fb5a5e2a016b5c1 [tag_name] => 好女孩 [image_id] => c57d2e6f501670487fb5a5e2a016b5c1 [类别] => 时尚 [许可证] => 专有实用程序(E [作者] => 丹尼尔·巴德 [拇指] => 资产/下载/img/thumb/c31598650ec51e6dd5725b2711920e91_thumb.jpg [prv] => 资产/下载/img/prv/fa1872139b4f53a840e94d7ceca1911e_P.jpg [date_uploaded] => 01 - 25 - 2014 [time_uploaded] => 1390657236 [search_id] => 1390652792 [使用政策] => ) ) [2] => 数组 ( [0] => 标准类对象 ( [img_id] => dfc7ec5aae7ce3b4397c57d4167b6417 [tag_name] => 腿 [image_id] => dfc7ec5aae7ce3b4397c57d4167b6417 [类别] => 生活方式 [许可证] => 广泛效用 (BU) [作者] => 生活方式 [拇指] => 资产/下载/img/thumb/97f4517f6d5bdad880151d940da638d6_thumb.jpg [prv] => 资产/下载/img/prv/fb7402b93ce27fe6e93e5578571e02fe_P.jpg [date_uploaded] => 01 - 25 - 2014 [time_uploaded] => 1390656768 [search_id] => 1390652324 [使用政策] => ) ) )

这是我认为的代码。

 @if(!empty($imgs))
    @for ($i=0; $i < count($imgs) ; $i++)
        <div class="span3 transition metal">
            <figure class="top-img">
                <img src="{{$backend_url}}{{$imgs[0][$i]->thumb}}" alt="{{$imgs[0][$i]->category}}" id='img{{$imgs[0][$i]->image_id}}'>
                <figcaption class="img-meta">
                    <div class="row-fluid">
                        <div class="span8">
                            <a href="{{$base_url}}image/{{$imgs[0][$i]->search_id}}" class="img-id">#{{$imgs[0][$i]->search_id}}</a>
                            <a href="#" class="img-tags">{{$imgs[0][$i]->category}}</a>
                        </div>
                        <div class="span4">
                            <a href="#" class="btn download-btn"><i class="icon-download"></i></a>
                        </div>
                    </div>
                </figcaption> <!-- end img-meta -->
                <div class="roll-over" data-source='{{$imgs[0][$i]->image_id}}'>
                    <a href="#" class="btn"><span class="bucket"><i class='icon-shopping-cart'></i></span></a>
                </div> <!-- end roll-over -->
            </figure> <!-- end top-img -->
        </div><!--  end span3 -->
@endfor
@endif

【问题讨论】:

  • 首先向我们展示您当前的代码/查询,然后我们将看看可以做些什么来改进它
  • 你使用的这个标签是什么样子的?
  • @Marcel 标签是从用户输入中获取的字符串,然后根据管理员已经为每个图像输入的标签在数据库中搜索
  • 你所说的“更有效和可行的方法”是什么意思?你想做什么你现在不能做?
  • @clod986 此方法将返回的数据数组存储在另一个数组($imageResult[])中,因此难以循环,此外,此方法不允许我显示所有找到的记录,它只显示前两个。

标签: php mysql sql database laravel


【解决方案1】:

我会这样做:

 @if(!empty($imgs))
    @foreach($imgs as $tag)
        @foreach($tag as $image)
        <div class="span3 transition metal">
            <figure class="top-img">
                <img src="{{$backend_url}}{{$image->thumb}}" alt="{{$image->category}}" id='img{{$image->image_id}}'>
                <figcaption class="img-meta">
                    <div class="row-fluid">
                        <div class="span8">
                            <a href="{{$base_url}}image/{{$image->search_id}}" class="img-id">#{{$image->search_id}}</a>
                            <a href="#" class="img-tags">{{$image->category}}</a>
                        </div>
                        <div class="span4">
                            <a href="#" class="btn download-btn"><i class="icon-download"></i></a>
                        </div>
                    </div>
                </figcaption> <!-- end img-meta -->
                <div class="roll-over" data-source='{{$image->image_id}}'>
                    <a href="#" class="btn"><span class="bucket"><i class='icon-shopping-cart'></i></span></a>
                </div> <!-- end roll-over -->
            </figure> <!-- end top-img -->
        </div><!--  end span3 -->
        @endforeach
    @endforeach
 @endif

如果这有效,则意味着您正在跳过两个循环之一。请注意我如何将您的 for 更改为 foreach 声明;我不将自己定位为经验丰富的编码员,但我喜欢让变量更具可读性而不是写$imgs[$i][$j]-&gt;something

【讨论】:

  • 你是一个很棒的人,感谢你一路帮助我,这个方法一气呵成,如果我们可以联系并保持联系,这个我的推特句柄也对你有帮助一天。在 mrbarde2k
  • 别担心 ;) 我不怎么用 twitter,但我会继续加你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 2015-06-18
相关资源
最近更新 更多