laravel

时间:2018-04-19 00:30:04

标签: php laravel laravel-5 laravel-5.5

我有一个名为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数据库,但我有一个问题。

在我的App\Http\ViewComposer\ImageComposer.php文件中,我有这个:

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

在任何视图中,我都可以使用{{$foo}}从我的images表中获取一个随机行,但数据的字符串是这样的:

  

[{“id”:10,“alt”:“Image Alt Tag”,“title”:“Image Title”,“file_name”:“10.jpg”}]

当我尝试仅抓取像{{$foo->file_name}}

这样的单个列时

我收到错误:

  

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

如何抓取这样的单个列:{{$foo->alt}}{{$foo->title}}{{$foo->file_name}}然后在我的视图中干净地输出它们?例如,我需要{{$foo->file_name}}这样呈现:5.jpg

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

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

如果没有get()方法,还是想知道是否有办法做到这一点。这会有效。

1 个答案:

答案 0 :(得分:3)

首先,您无法@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

您的撰写方法如下所示:

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'
    );
}

*表示您希望将此编辑器应用于所有视图。