我有一个名为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()方法,还是想知道是否有办法做到这一点。这会有效。
答案 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将在AppServiceProvider
或ComposerServiceProvider
等新提供商中注册。在您需要的boot
方法内部:
public function boot()
{
// Using class based composers...
View::composer(
'*', 'App\Http\ViewComposers\ImageComposer'
);
}
*
表示您希望将此编辑器应用于所有视图。