在使用Laravel 5.3将其发送到视图之前,我需要对从数据库返回的数据运行各种字符串函数.像str_replace()这样的基本内容.
现在也许有一个很好的方法在我的模型上设置Accessors并以某种方式在着陆页上使用该模型,但我想我会走另一条路线,只是在模型之外手动执行这一个查询.
所以我有一个视图提供程序,可以成功地将我的数据导入视图.它看起来像这样:
class ViewLandingProvider extends ServiceProvider { public function boot() { // process when featured homepage element is present... View::composer('mybladetemplate',function ($view){ $featuredProperties = DB::table('properties') ->where([ ['featured_property','=','1'],['supplier_id',123],]) ->orderBy('prop_id','desc') ->limit(6) ->get(); // run str_replace! $featuredProperties->each(function($property){ $property->prop_url=str_replace("http://domain.com/","http://www.domain.com/",$property->prop_url); }); View::share('featuredProperties',$featuredProperties); }); } }
然后它在一个视图中循环,一切都很好
@if(isset($featuredProperties)) @foreach ($featuredProperties as $property) <li> <a title="{{ $property->prop_name }}" href="{{ $property->prop_url }}"></a> </li> @endforeach @endif
正如您在上面的示例中所看到的,我使用 – > each()在数据集合上运行str_replace(),并且我正在努力让我做一个我需要进行的简单字符串替换.
虽然是Laravel,但我确信有一些魔法可以被拉到这里以更聪明地做到这一点.
我想你可能正在寻找一个集合宏.您可以在AppServiceProvider中注册它,如:
Collection::macro('formatPropUrl',function() { return collect($this->items)->map(function($property) { $property->prop_url=str_replace("http://domain.com/",$property->prop_url); return $property; }); });
然后,您可以执行以下操作:
$featuredProperties = DB::table('properties') ->where([ ['featured_property',]) ->orderBy('prop_id','desc') ->limit(6) ->get() ->formatPropUrl();