如何从与数据透视相关的行中获取 Builder 对象 - Laravel
Posted
技术标签:
【中文标题】如何从与数据透视相关的行中获取 Builder 对象 - Laravel【英文标题】:How to get a Builder object from rows related to pivot - Laravel 【发布时间】:2015-02-11 09:14:52 【问题描述】:我正在尝试获取一位用户拥有的所有“书籍”:但我无法按照自己的需要进行操作。
我使用以下代码:
/*Gets all books from the user whose id is 1*/
$books= User::find(1)->books();
返回给我一个Collection
对象;但我需要一个 Builder
对象,就像我使用“选择”方法时得到的那样。
/* This code return me a "Builder" object */
Books::select(array('id', 'name', 'type'));
我需要 Builder
而不是 Collection
,因为我在我的项目中使用 Bllim/Datatables 并且这个包只接受 Builder
对象...
如果我给它发送Collection
它会抛出下一个错误(500 - 内部服务器错误):
"error":
"type":"ErrorException",
"message":"Undefined property: Illuminate\\Database\\Eloquent\\Builder::$columns",
"file":"\/var\/www\/proyect\/myproyect\/vendor\/bllim\/datatables\/src\/Bllim\/Datatables\/Datatables.php",
"line":256
有人知道解决办法吗?
编辑:
当我两次使用 getQuery() 方法时,出现以下错误:
"error":"type":"ErrorException","message":"array_values() expects parameter 1 to be array, null given","file":"\/var\/www\/proyect\/myproyect\/vendor\/bllim\/datatables\/src\/Bllim\/Datatables\/Datatables.php","line":550
很少见,因为当我使用“选择”方法时,数据表工作得很好......
此代码有效:
Books::select(array('id', 'name', 'type'));
但是你告诉我的代码不起作用:
$user = User::find(1);
$user->books()->getQuery()->getQuery();
【问题讨论】:
可能存在通过“选择”方法获取所有书籍的任何方式? 如果您使用User::find(1)->books()
...请注意 () 它将允许您查询结果集。
对不起,是一个“错字”错误。我的代码中有“()”:但抛出了我的问题中指出的错误
【参考方案1】:
使用方法调用books()
:
$user = User::find(1);
$user->books(); // relation object
$user->books; // dynamic property
首先books()
返回一个关系对象,您可以将Eloquenr\Builder
或Query Builder
方法链接到该对象上。
第二个books
是一个动态属性——查询会自动执行,其结果存储在$user->relations['books']
中并返回。
编辑
根据评论 - 如果您想访问 columns
属性,您需要的是基础 Query\Builder
对象,因此您需要两次 getQuery
:
$user->books()
->getQuery() // get underlying Eloquent\Builder
->getQuery() // get underlying Query\Builder
->columns // public property on the above
【讨论】:
Jarek Tkaczyk,对不起,是一个“错字”错误。我的代码中有“()”:但抛出了我的问题中指出的错误。 感谢您的所有时间。以上是关于如何从与数据透视相关的行中获取 Builder 对象 - Laravel的主要内容,如果未能解决你的问题,请参考以下文章