【问题标题】:Search in Laravel after eager loading the records?急切加载记录后在 Laravel 中搜索?
【发布时间】:2015-01-06 06:28:47
【问题描述】:

我有一个flights 表,它有两个外键列:起源和目的地,它们都链接到airports 表。现在我可以很好地加载记录了:

Flight::with('origin', 'destination')->get();

但现在我想做这样的事情:

Flight::with('origin', 'destination')->where('origin.name', 'LIKE', "$query%")->get();

但它给了我一个错误,说没有名为 origin.name 的列,这对我来说是有意义的,但是我如何在急切加载的数据中搜索记录?

【问题讨论】:

    标签: php search laravel laravel-4 eager-loading


    【解决方案1】:

    whereHas 应该可以工作:

    Flight::with('origin', 'destination')->whereHas('origin', function($q) use ($query){
        $q->where('name', 'LIKE', "$query%");
    })->get();
    

    【讨论】:

    • 虽然我对这里发生的大部分事情都有所了解,但我永远不明白use 的用途以及它是如何实现的。我知道它是 PHP 中名称空间的一部分,这一直让我感到困惑。为什么我不能只在参数中传递$query 变量。我知道我的问题可能听起来很愚蠢,但仍有一些事情超出了我的理解范围。
    • 不,它实际上与命名空间无关。它是变量范围。你看,像$query 这样的局部变量在闭包(又名匿名函数)中不可用,因为它们有自己的变量范围。使用use,您声明要使用闭包内可用的变量。
    • 我想现在更有意义了。谢谢。
    【解决方案2】:

    你需要一个闭包来使它正确。这是一个简单的例子。

    $places = Flight::with(array('origin' => function($query) use($query_name)
    {
     $query->where('name', 'LIKE', "$query_name%");
    }))->get();
    

    希望这会有所帮助。

    【讨论】:

    • 这不会按某个起点名称过滤航班,而只会在条件为真时加载起点。
    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2021-04-23
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多