【问题标题】:Laravel 4: How to use an Accessor in a where-clauseLaravel 4:如何在 where 子句中使用访问器
【发布时间】:2015-01-31 00:52:51
【问题描述】:

是否可以在 Laravel 4 中使用 Accessor 进行比较,例如:

class User extends Eloquent {

   // define Accessor
   public function getSpecialNameAttribute()
   {
       return 'Joda';
   }

}

$User = User::where('gender','=','male')->where('specialName','=','Joda');

?

【问题讨论】:

    标签: php database laravel-4 eloquent accessor


    【解决方案1】:

    是的,您可以使用它来过滤查询结果:

    User
        ::where('gender','=','male')
        ->get()
        ->filter(function($item) {
            return $item->specialName === 'Luke';
        });
    

    (!) 请注意,过滤将在查询数据库之后应用,因此在大数据的情况下,此解决方案将出现性能问题。

    有关更多详细信息,我已经为您搜索了this Collections tutorial

    另外我建议query scopes 可能有助于以最佳方式完成您的任务。

    【讨论】:

    • 是的,这就是我正在寻找的方式。就我而言,没有大数据,所以这就足够了。谢谢!
    • 当我的集合以 json 形式返回时,过滤器会将我的集合变成一个对象。有没有办法告诉 filter 使它成为一个数组?
    【解决方案2】:

    不,你不能这样使用它。

    使用时:

    $user = User::where('gender','=','male')->where('specialName','=','Joda')->get();
    

    您将尝试将数据库中的specialName 列与Joda 字符串进行比较。

    您不能在这里使用访问器,因为访问器可能非常复杂,然后 Laravel 需要从数据库中的表中获取所有数据(例如 100000 条记录)并计算所有这些访问器的访问器,以便只为您获取您需要的记录(例如 1 条记录)。

    访问器只能在有对象实例的情况下使用,查询数据库时不能使用。

    【讨论】:

    • 这可以用leftJoin 完成吗?如果可能的话,请你举个例子。
    猜你喜欢
    • 2017-11-06
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 2014-02-06
    • 2019-09-08
    相关资源
    最近更新 更多