如何从与数据透视相关的行中获取 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\BuilderQuery 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的主要内容,如果未能解决你的问题,请参考以下文章

您可以对数据透视表中的行和/或列进行小计吗?

如何获得解码/未透视行的唯一计数(列到行)

Django:如何从与用户相关的子查询集中获取不同的父列表?

Laravel如何通过数据透视表获取相关字段列表

如何从最后插入的行中获取值? [复制]

如何在javascript中使用从数据库返回的行中的数据