【问题标题】:Laravel queries in route / controller / model etc路由/控制器/模型等中的 Laravel 查询
【发布时间】:2014-12-27 10:19:39
【问题描述】:

这些问题中的另一个......

试图深入了解如何正确执行此操作。

所以目前我有这样的路线:

Route::get('/', function()
{
    return View::make('pages/home');
});

在那个页面我有:

$builds = DB::table('blogs')->where('frontpage', '1')->orderBy('id', 'desc')->paginate(20);

foreach ($builds as $build) {
  // do stuff
}

这可行,但我知道不应该在视图本身中进行查询。它们应该在哪里?如何才能最好地将数据放入视图中?

到目前为止,我可以让它工作的唯一其他方法是将查询放入路由本身并压缩变量:

Route::get('/', function()
{
  $builds = DB::table('blogs')->where('frontpage', '1')->orderBy('id', 'desc')->paginate(20);
  return View::make('pages/home', compact('builds'));
});

但我相信这也不正确?

我也尝试在我的模型中加入一个函数:

public static function findBuilds(){
    DB::table('blogs')->where('frontpage', '1')->orderBy('id', 'desc')->paginate(20);
}

然后在路由中:

Route::get('/', function()
{
  $builds = Blog::findBuilds();
  return View::make('pages/home', compact('builds'));
});

但是当我尝试使用我的 ->links 函数在视图中进行分页时,这给了我一个非对象错误。

我该怎么办?一旦我知道一旦生病就好了:)

谢谢!

【问题讨论】:

  • 你为什么要在路由中做这么多逻辑?对于您的类未找到问题,这取决于您的自动加载器

标签: php laravel laravel-routing


【解决方案1】:

您的findBuilds 方法中缺少return 语句:

public static function findBuilds()
{
    return DB::table('blogs')->where('frontpage', '1')->orderBy('id', 'desc')->paginate(20);
//  ^^^^^^ 
}

也就是说,既然您无论如何都在模型中,请使用模型而不是退回到 DB 类:

public static function findBuilds()
{
    return static::where('frontpage', '1')->latest('id')->paginate(20);
}

【讨论】:

  • 啊,我怎么能忘记回报 -.- 谢谢你的魅力。还要感谢对查询的返工,需要查看其中一些选项,例如最新的。
【解决方案2】:

传统上,您可以将此逻辑放入您的 Controller,而不是您的 routes.php、模型或视图中 - 对于您的情况,它可能是一个名为:PagesController 的控制器:

/app/routes.php

// tell Laravel to route all requests to /pages/ to your PagesController
Route::controller('pages', 'PagesController');

/app/controllers/PagesController.php

// now create your routes in PagesController:
class PagesController extends BaseController {

    // handles: GET pages/home
    public function getHome()
    {
        $builds = DB::table('blogs')
                    ->where('frontpage', '1')
                    ->orderBy('id', 'desc')
                    ->paginate(20);
        // pass your $builds to your view
        return View::make('pages/home')->with('builds', $builds);
    }
}    

/app/views/pages/home.blade.php 使用blade syntax 提取$builds 数组中每个元素的各种属性和值

@foreach($builds as $build)
// do something with the elements of your builds array
   <div class="build">
     <h2>{{ $build->name }}</h2>
     <!-- etc etc etc-->
   </div>
@endforeach

如果您正在构建一个小型应用程序,这可能是矫枉过正.. 所以您确实想在您的 routes.php 中执行此操作,只需将此逻辑添加到路由中并使用相同的 blade syntax 循环通过您的 $builds

Route::get('/', function()
{
    $builds = DB::table('blogs')->where('frontpage', '1')
                                ->orderBy('id', 'desc')
                                ->paginate(20);
    return View::make('pages/home')->with('builds', $builds);
});

(注意 - 对于有很多路由的大型应用程序来说,这不是一个好的做法。您的 routes.php 将填满并让您的生活变得更加艰难。如果可以,请使用控制器!)

【讨论】:

  • 从来没有想过要拥有一个页面控制器,我看不好实现它:)
  • @user2921557 好吧......也许你不需要它来做一个小应用程序......但我通常发现使用控制器更容易组织自己,而不是拥有一个巨大的 routes.php! :) 祝你好运!
猜你喜欢
  • 2018-01-16
  • 1970-01-01
  • 2018-07-23
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2017-02-27
相关资源
最近更新 更多