【问题标题】:Laravel not returning join query to bladeLaravel 没有将连接查询返回给刀片
【发布时间】:2014-07-04 07:44:36
【问题描述】:

我有两个查询,一个是通过使用数据透视表作为过滤器从主表(在本例中为学生)获取数据来处理数据。

$students=\DB::table('student')->join('school_student', 'student.id', '=','school_student.student_id')->get(); 

这会从控制器返回一个查询结果。但不会加载到刀片中:

$this->layout->content=\View::make('admin.students.index')->with('student', $students);

而此版本返回类似的更多数据(即每次输出所有学校数据) 但适用于刀片。

$students = \Student::with(array('schools' => function($query){$query->where('school_id', '=', 1);}))->get();

仅仅是DB和视图不兼容吗? 如果是这样,查询一张表的 Laravel 4 方法是什么,它只是数据透视表。

任何帮助表示赞赏。

在刀片中

@if($student->count())

第一个例子产生了这个错误:

Call to a member function count() on a non-object 

【问题讨论】:

  • 那么如果你var_dump($student); 在两个查询之后它们都包含相同的结构和数据?
  • 当你说“但不会加载到刀片中”时,这是否意味着你的视图变空了,或者它抛出了错误?这两种获取学生的方法是不等价的,您使用的第一种不使用模型和关系,而第二种使用。请发布刀片模板的代码,以便我们进行更多解释。
  • 我已添加刀片问题。 @Jeemusu 第二个(不工作)产生一个更大的数组,但问题是数组没有通过。@unnawut 发布了刀片部分。有没有办法在没有额外数据的情况下使用模型?刀片参数不使用模型问题吗?

标签: laravel pivot-table blade


【解决方案1】:

DB::...->get() 返回一个数组,因此您不能在其上调用->count()(因此是“非对象”),而是需要count($students)

->count() 在您执行“更多数据重”方法时起作用的原因是您正在使用 Eloquent,它返回 Eloquent Collections。

所以,基本上,你在做两件不同的事情,并期望以同样的方式对待它们。


另外,当我在这里时,我应该指出,我认为您的 Eloquent 查询不太正确。首先,您将 id 硬编码为 1(而在 DB 样式的查询中,您不关心学校 ID,您只需使用它来加入数据透视表 - 也许您使用了不完整的查询),而且您正在使用with,但您可能应该查看haswith eager-loads 模型,但如果您只想检查连接表上的条件,has 是您想要的。

【讨论】:

  • 谢谢。那么非 Eloquent 模型仍然更高效?
  • 我想这取决于您对高效的定义,但是通常它会随着 更好地控制查询(取决于您想要传递的列如果您对效率很认真,您想检索到->get() 调用,因为执行->get(0 仍然会获取数组的所有列),并且它只返回轻量级数组而不是较重的对象。另外,我认为您的 Eloquent 行有一点缺陷 - 您的想法是正确的,但您不是在做 has,而是在做 with,它实际上执行连接并急切加载 School模型。
  • 谢谢,非常感谢
  • Np - 我在答案中添加了关于 with/has 的内容。但是,是的,您应该查看Eloquent's has method,因为它对您的目的非常有用。我可以补充一点,虽然 DB 方式可能会更有效,但只要你没有一个巨大的(如果不是 GiB,至少有 100 个 MiB)数据库和大量的每日点击量,也许这有点东西是过早的优化,有时更具描述性(尽管效率较低)的代码更适合可维护性。只是一个想法。
猜你喜欢
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 2016-05-03
  • 2016-09-09
  • 2019-01-20
  • 1970-01-01
相关资源
最近更新 更多