返回 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:选择id
,users
.*,role_user
.role_id
as pivot_role_id
,role_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('selectid
,u...', Array, Object(Closure)) <div>#1 /Users/Public/Website/cast/vendor/illuminate/database/Illuminate/Database/Query/Builder.php(1312): Illuminate\Database\Connection->select('select
id,
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->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 从表中抓取特定列并作为熊猫数据框返回