返回 Laravel 中模型的特定列并转换为 Json

Posted

技术标签:

【中文标题】返回 Laravel 中模型的特定列并转换为 Json【英文标题】:Return the specific column for a model in Laravel and convert to Json 【发布时间】:2014-07-06 07:48:24 【问题描述】:

有两个表是多对多关系:

用户:

<?php class User extends Eloquent 

    public function roles()
    
        return $this->belongsToMany('Role');
     

角色:

class Role extends Eloquent 

    public function users()
    
        return $this->belongsToMany('User');
    


获取所有字段的用户并将其转换为json没有问题:

    $role = Role::find($id)->users()->get()->toArray();        
    var_dump($role);

但是当我试图只检索用户 id 字段时,我遇到了将其转换为 json 的问题,这是我的代码:(如果我不调用 ->get()->toArray(), var_dump 没有问题。)

    $role = Role::find($id)->users()->select(array('id'))->get()->toArray(); 
    var_dump($role);

有什么想法吗?谢谢

编辑:

错误信息:

Slim Application Errorbodymargin:0;padding:30px;font:12px/1.5 Helvetica,Arial,Verdana,sans-serif;h1margin:0;font-size:48px;font-weight:normal;line -height:48px;strongdisplay:inline-block;width:65px;

Slim 应用程序错误

由于以下错误,应用程序无法运行:

详情

类型: Illuminate\Database\QueryException代码: 23000消息: SQLSTATE[23000]:完整性约束违规:1052 字段列表中的列 'id'是模棱两可的(SQL:选择idusers.*,role_user.role_id as pivot_role_idrole_user.user_id as pivot_user_id from users@34 内连接@987653 987654335@.id = role_user.user_id 其中role_user.role_id = role_1)文件: /Users/Public/Website/cast/vendor/illuminate/database/Illuminate /Database/Connection.php行: 555

跟踪

#0 /Users/Public/Website/cast/vendor/illuminate/database/Illuminate/Database/Connection.php(283): Illuminate\Database\Connection->run('select id, u...', Array, Object(Closure))
<div>#1 /Users/Public/Website/cast/vendor/illuminate/database/Illuminate/Database/Query/Builder.php(1312): Illuminate\Database\Connection->select('selectid ,u...',数组)
#2 /Users/Public/Website/cast/vendor/illuminate/database/Illuminate/Database/Query/Builder.php(1302): Illuminate\Database\Query\Builder->runSelect()
#3 /Users/Public/Website/cast/vendor/illuminate/database/Illuminate/Database/Query/Builder.php(1289): Illuminate\Database\Query\Builder->getFresh(Array)
#4 /Users/Public/Website/cast/vendor/illuminate/database/Illuminate/Database/Eloquent/Builder.php(416): Illuminate\Database\Query\Builder->get(Array)
#5 /Users/Public/Website/cast/vendor/illuminate/database/Illuminate/Database/Eloquent/Relations/BelongsToMany.php(145): Illuminate\Database\Eloquent\Builder->getModels()
#6 /Users/Public/Website/cast/app/controllers/Api/v1/TestController.php(24): Illuminate\Database\Eloquent\Relations\BelongsToMany->get()
#7【内部函数】:Api\v1\TestController->testRelation('role_1')
#8 /Users/Public/Website/cast/vendor/slim/slim/Slim/Route.php(173): call_user_func_array(Array, Array)
#9 [内部函数]:Slim\Route->Slimclosure('role_1')
#10 /Users/Public/Website/cast/vendor/slim/slim/Slim/Route.php(462): call_user_func_array(Object(Closure), Array)
#11 /Users/Public/Website/cast/vendor/slim/slim/Slim/Slim.php(1326): Slim\Route->dispatch()
#12 /Users/Public/Website/cast/vendor/slim/slim/Slim/Middleware/Flash.php(85): Slim\Slim->call()
#13 /Users/Public/Website/cast/vendor/slim/slim/Slim/Middleware/MethodOverride.php(92): Slim\Middleware\Flash->call()
#14 /Users/Public/Website/cast/vendor/slim/slim/Slim/Middleware/PrettyExceptions.php(67): Slim\Middleware\MethodOverride->call()
#15 /Users/Public/Website/cast/vendor/slim/slim/Slim/Slim.php(1271): Slim\Middleware\PrettyExceptions->call()
#16 /Users/Public/Website/cast/vendor/illuminate/support/Illuminate/Support/Facades/Facade.php(205): Slim\Slim->run()
#17 /Users/Public/Website/cast/public/index.php(4): Illuminate\Support\Facades\Facade::__callStatic('run', Array)
#18 /Users/Public/Website/cast/public/index.php(4): SlimFacades\App::run()
#19 主要

编辑 2:

错误是由 select 语句中的字段引起的。我把它改成:

$role = Role::find($id)->users()->select(array('users.id'))->get()->toArray(); 
var_dump($role);

它现在返回一些值。但不幸的是,它仍然返回所有字段,而不仅仅是“users.id”字段。

【问题讨论】:

什么是“型号”?角色不应该扩展 Eloquent 吗? 对不起。这是一个雄辩的模型。 (我正在使用扩展 Eloquent 的 SlimStarter)。 您尝试运行命令时遇到的“问题”/“错误”是什么? 我认为我应该使用“users.id”。 在我修复了文件名问题后,我可以得到结果。但不幸的是,它仍然返回所有字段而不是我选择的字段。 【参考方案1】:

根据 Taylor Otwell 的说法,目前无法选择使用 belongsToMany 返回的列:https://github.com/laravel/laravel/issues/2679

这个解决方案怎么样:

角色

class Role extends Eloquent 

    public function users()
    
        return $this->belongsToMany('User')->select('id');
    


然后

$roles = Role::find($id)->with('users')->get();
$users = $roles->users;
$usersId = $users->lists('id');

【讨论】:

感谢您的回复。首先,我应该在 select('id') 中将 'id' 更改为 'users.id'。但是 $users = $roles->users();什么都不返回。 如果你打错了是$users = $roles-&gt;users;【参考方案2】:

这是基于 Antoine Augusti 回答的最终工作版本:

角色.php:

<?php

class Role extends Model 

    public function users()
    
        //return $this->belongsToMany('User');
        return $this->belongsToMany('User')->select('users.id');
        

我列出所有用户 id 的代码:

    $roles = Role::find($id);
    $users = $roles->users();
    $usersId = $users->lists('users.id');
    var_dump($usersId);

usersId 将仅显示数组中的用户 ID。但我认为 $users 仍然包括所有字段。

无论如何它解决了我的问题,虽然它并不完美。感谢安托万·奥古斯蒂。

【讨论】:

以上是关于返回 Laravel 中模型的特定列并转换为 Json的主要内容,如果未能解决你的问题,请参考以下文章

如何将 laravel 模型工厂创建方法返回的对象转换为包含模型字段的数组?

Laravel:如何查询包含json数据的表中的列并仅返回查询匹配的对象

如何使用 BeautifulSoup 从表中抓取特定列并作为熊猫数据框返回

如何使用scala将特定函数转换为apache spark中的udf函数? [复制]

laravel怎么把对象转换为数组

Pandas:将特定功能应用于列并创建其他列