【问题标题】:Random images in laravellaravel 中的随机图片
【发布时间】:2018-09-29 08:33:18
【问题描述】:

我有一个名为 random_img 的数据库表。里面有 10 行,10 张图片。

我将从 public/images/random 中提取图像

我想使用数据库,所以我可以将循环设置为 Random take(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

RandomImgsController:(这应该放在哪里,以便我可以全局使用)

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":"图片替代标签","title":"图片标题","file_name":"10.jpg"}]

当我尝试只抓取像这样的单个列时 {{$foo-&gt;file_name}}

我得到错误:

此集合实例上不存在属性 [file_name]。

我怎样才能像这样抓取单个列:{{$foo-&gt;alt}}{{$foo-&gt;title}}{{$foo-&gt;file_name}},然后在我的视图中干净地输出它们?例如,我需要 {{$foo-&gt;file_name}} 像这样渲染:5.jpg

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

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

仍然想知道是否有没有 get() 方法的方法。不过这会起作用。

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.5


    【解决方案1】:

    首先,您不能在刀片模板中@include 路由。您实际要做的是将刀片模板中的 AJAX 请求发送到您创建的路由以检索随机图像。不过……

    在这种情况下,控制器的逻辑位置听起来好像是错误的。

    假设您的表有一个关联的 Eloquent 模型,一个简单的选项可能是在您的 RandomImage 模型上定义一个方法(可能只是称为 Image)。

    这样,您可以使用您的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');
    });
    

    您可以在 Image 模型上使用查询范围来实现此目的:

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

    编辑

    如果您希望在您网站中的许多甚至所有视图中使用它,您可以使用 View Composer:https://laravel.com/docs/5.6/views#view-composers

    您的 compose 方法如下所示:

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

    View Composer 将在您的AppServiceProviderComposerServiceProvider 等新提供程序中注册。在您需要的boot 方法内部:

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

    * 表示您希望将此作曲家应用于所有视图。

    【讨论】:

    • 我喜欢你的逻辑,但我想在我网站的每个页面上使用随机图像。我将如何在您展示的内容中实现这一目标?我用常规 php 中的做法更新了我的问题。
    • 我明白你现在的要求了。我更新了我的答案。
    • 我越来越接近解决这个问题,但遇到了一个问题。请参阅UPDATE 我的问题。谢谢!
    • 我想通了。我必须使用@foreach,因为我使用的是get()
    • @echo 对此感到抱歉。那是我的一个错误。如果您只想要一张随机图像,您只需致电Image::random();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多