laravel orm:来自几乎相同查询的不同结果

Posted

技术标签:

【中文标题】laravel orm:来自几乎相同查询的不同结果【英文标题】:laravel orm: different result from almost same query 【发布时间】:2017-10-05 12:05:55 【问题描述】:

我非常怀疑 laravel 是如何用于一个非常简单的事情的:

如果我打电话:

$companies=User::All();

然后我可以在forach 中使用这样的语句:

foreach($companies as $company)
$company['new_field']= 'something';

如果我限制查询的输出,例如:

$companies = DB::table('companies')
            ->select('id','name','email','business_name',...)->get();

事情不像以前那样了,

我尝试使用或不使用->get() 我尝试使用 ->toArray() 进行转换(出现错误) 我尝试使用 put() and push() 收集方法并再次出现错误...

如何在集合的每个项目中添加一个字段以将其传递给视图?

【问题讨论】:

我不会想到用户模式使用公司表,除非它已被更改.. 如果是这样,它不应该被称为用户 是的,模型是定制的!一切都很好! 确实想在其中使用自定义属性 【参考方案1】:

试试这个,希望对你有用:

$users=User::select('id','name','email','business_name',...)->get()->toArray();

然后像这样使用 foreach 循环:

foreach($users as $key => $value )
    $users[$key]['newField'] = "Demo";

【讨论】:

$key => $value 的作用是什么? 如果我使用 select as u describe 而没有 toArray 部分,我可以通过访问 $company['new_fiel']=something 来添加一个像之前一样的字段! @JahStation 您可以删除$key => $value 部分。这是我使用的一般做法。【参考方案2】:

如果你在使用 Laravel 和模型,那么有一个更好的方法来添加自定义属性或字段,这就是我为自定义字段所做的

例如:

有一个型号名称用户 所以在用户模型中 添加属性名称,如:

class User extends Model

    protected $appends = ['new_field'];

    public function getNewFieldAttribute() // defining field logic here
    
        return // your code
    

因此您无需使用 foreach 和循环并添加新字段

更多请查看 laravel 文档:https://laravel.com/docs/5.5/eloquent-mutators#accessors-and-mutators

建议

你也可以用 Model 来限制你的输出。

User::select('id','name','email','business_name',...)->get();

如果你正在制作一个像

这样的数组
User::select('id','name','email','business_name',...)->get()->toArray();

所以这也会给你你的自定义字段

【讨论】:

感谢我看到了这种方法,但我需要更多的快速方法来传递一个对象,将事物封装在一个集合中,并且该字段依赖于另一个查询...

以上是关于laravel orm:来自几乎相同查询的不同结果的主要内容,如果未能解决你的问题,请参考以下文章

Laravel QueryBuilder - 相同查询的 `where()` 和 `whereRaw()` 结果不同

来自 SQL 的 Laravel Eloquent ORM 聚合函数

Laravel Eloquent ORM - 获取第一和第三表数据

几乎相同的 PostgreSQL 查询相差 1 分钟?

Laravel Eloquent ORM - 选择所有两个关系都不存在的模型时,生成的 SQL 和查询构建器结果不匹配

CloudKit - 每次运行相同的查询时,CKQueryOperation 结果都不同