Laravel 4:如何在 where 子句中使用访问器

Posted

技术标签:

【中文标题】Laravel 4:如何在 where 子句中使用访问器【英文标题】:Laravel 4: How to use an Accessor in a where-clause 【发布时间】: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');

?

【问题讨论】:

【参考方案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 完成吗?如果可能的话,请你举个例子。

以上是关于Laravel 4:如何在 where 子句中使用访问器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 雄辩的关系中使用 where 子句

如何在 switch 语句中使用 laravel 模型运行多个 Where 子句

Laravel 4:可选 where 子句

如何在 Laravel 中 MySQL 查询的 where 子句中使用数组 [重复]

如何使用 Laravel Eloquent 创建多个 Where 子句查询?

如何使用 Laravel Eloquent 创建多个 Where 子句查询?