代码之家  ›  专栏  ›  技术社区  ›  daugaard47

laravel中的随机图像

  •  1
  • daugaard47  · 技术社区  · 8 年前

    我有一个名为random\u img的数据库表。里面有10行10幅图像。

    我将从公共/图像/随机中提取图像

    我想使用数据库,以便将循环设置为随机抽取(1)。我想在我的英雄形象中使用。(每页刷新新图像)

    我应该将数据库查询放在哪里,以便全局使用它?或者我如何使用 RandomImgsController 那么它正在全球范围内使用?

    我创建了一个路由文件,因此可以在需要时将其用作包含。

    路线:

    Route::post('/layouts/inc/random-img','RandomImgsController@randomimg')->name('random-img');
    

    包括:

    @include('layouts.inc.random-img')
    

    内部包括:

      @foreach ($randomimg as $rand)
      <span class="hero-image">
                <img src="/images/random/{{$rand->file_name}}" class="img--max--hero blur-img">
                </span>
    @endforeach
    

    随机imgscontroller: (这应该放在哪里,以便我可以在全球范围内使用)

    public function randomimg()
    {
        $randomimg = DB::table('randomimg')->orderBy(DB::raw('RAND()'))->get();
        return view('random-img',compact('randomimg'));
    }}
    

    这就是我想在我的网站的每个页面上实现的目标:

    @php
    $randomimg = DB::table('randomimg')->orderBy(DB::raw('RAND()'))->get()->take(1);    
    @endphp
      @foreach ($randomimg as $rand)
      <span class="hero-image">
                <img src="/images/random/{{$rand->file_name}}" class="img--max--hero blur-img">
                </span>
    @endforeach
    

    有什么更干净的方法可以做到这一点?

    更新时间:

    我可以访问 images DB现在在所有视图中,但我有一个问题。

    在我的 App\Http\ViewComposer\ImageComposer.php 文件我有:

    public function compose(View $view)
    {
        $view->with('foo', Image::inRandomOrder()->get()->take(1));
    }
    

    在我可以使用的任何视图中 {{$foo}} 从“我的图像”表中获取随机行,但数据以如下字符串形式出现:

    [{“id”:10,“alt”:“Image alt Tag”,“title”:“Image title”,“file\u name”:“10.jpg”}]

    当我试图只抓取像这样的单个列时 {{$foo->file_name}}

    我得到错误:

    此集合实例上不存在属性[file\u name]。

    我如何获取这样的单个列: {{$foo->alt}} ,则, {{$foo->title}} {{$foo->文件名}} 然后在我的视图中清晰地输出它们?例如,我需要 {{$foo->文件名}} 要这样渲染,请执行以下操作: 5.jpg

    更新2: 我想出来了。必须使用 @foreach 因为我用的是 get() 方法

    @foreach($foo as $f)
    {{$f->file_name}}
    @endforeach
    

    仍然想知道是否有一种方法可以在不使用get()方法的情况下完成。但这会奏效的。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Dan Fletcher    8 年前

    首先你不能 @include 刀片模板中的管线。实际上,您要做的是将一个AJAX请求从刀片模板发送到您创建的用于检索随机图像的路由。然而

    在这种情况下,控制器似乎是错误的逻辑位置。

    假设您的表有一个关联的雄辩模型,一个简单的选项是在 RandomImage 模型(可能只是 Image )。

    这样,您就可以使用 形象 模型生成随机图像并将其传递给您想要的任何视图。然后,也不需要查询每个页面上的每个图像重新加载。每个请求只能查询一个图像。

    想象一下,如果您视图中的代码如下所示:

    <span class="hero-image">
        <img 
            src="{{ $image->url() }}" 
            class="img--max--hero blur-img" />
    </span>
    

    例如,这可能属于主页,这听起来像是你正在尝试的。所以也许你有这样一条路线:

    Route::get('/', function () {
        $image = App\Image::random();
        return view('home', compact('image');
    });
    

    您可以使用 形象 型号:

    public function scopeRandom($query)
    {
        return $query->inRandomOrder()->first();
    }
    

    编辑

    如果您想在网站中的多个甚至所有视图中使用此功能,可以使用视图生成器: https://laravel.com/docs/5.6/views#view-composers

    您的撰写方法如下所示:

    public function compose(View $view)
    {
        $view->with('image', Image::random());
    }
    

    视图生成器将在 AppServiceProvider 或在新提供商中,如 ComposerServiceProvider .内部 boot 您需要的方法:

    public function boot()
    {
        // Using class based composers...
        View::composer(
            '*', 'App\Http\ViewComposers\ImageComposer'
        );
    }
    

    其中 * 表示希望将此生成器应用于所有视图。