我在Laravel 4.2中使用Eloquent ORM时出现问题
我有2个表,银行和bank_accounts
在银行中,我有银行的ID,在bank_accounts表中,我有bank_id,而且它的外键指向银行表。
我一直在努力工作几个小时并且没有任何运气地查看Laravel文档。
我有两种模式:
BankAccounts模型:
<?php
use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;
class Cuentas extends Eloquent
{
protected $table = 'icar_cuentas';
protected $primaryKey = 'id';
public $timestamps = FALSE;
public function Banco()
{
return $this->belongsTo('Bancos','id_banco');
}
}
银行模型:
<?php
use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;
class Bancos extends Eloquent
{
protected $table = 'icar_bancos';
protected $primaryKey = 'id';
public $timestamps = FALSE;
public function cuentasRelacionadas()
{
return $this->hasMany('Cuentas');
}
}
我需要的是列出用户添加的帐户并显示其相关银行的名称,但没有弄清楚如何操作。
到目前为止,我已经在控制器中了:
public function showCuentas()
{
$results = Cuentas::all();
return View::make('content.bancos.list_bancos', array('bancos' => $results));
}
观点:
<tbody>
@foreach($bancos as $banco)
@if($banco->activo == 'si')
{{-- */$estado = '<span class="label label-success">Activo</span>';/* --}}
@endif
@if($banco->activo == 'no')
{{-- */$estado = '<span class="label label-danger">Inactivo</span>';/* --}}
@endif
<tr>
<td><a href="{{ URL::to('cuentas/editar/'.Encryption::encode($banco->id)) }}"><i class="fa fa-edit"></i></a> | <a href="{{ URL::to('cuentas/eliminar'.Encryption::encode($banco->id)) }}" onclick="return confirma('Realmente deseas eliminar la cuenta {{ $banco->cuenta }}');"><i class="fa fa-trash-o"></i></a></td>
<td>{{ $banco->banco->first()->banco }}</td>
<td>{{ $banco->cuenta }}</td>
<td>{{ $banco->tipo }}</td>
<td>{{ $estado }}</td>
</tr>
@endforeach
</tbody>
但它总是在表格中显示第一个银行的名称而不是相关的名称。
感谢任何帮助
答案 0 :(得分:2)
您不应该使用延迟加载,因为对于每个Cuenta
,您将在数据库中有另一个查询。请改用加载:
$results = Cuentas::with('banco')->get();
然后你去:
foreach($bancos as $banco) { //--> I think you should replace with cuentas, but it's up to you
....
{{ $banco->banco->banco }} // also, terrible. Use banco.name instead. Give proper name to easily understand your code
....
}
答案 1 :(得分:0)
好吧,医生说方法Model :: belongsTo(laravel 4.2)
belongsTo( string $related, string $foreignKey = null, string $otherKey = null, string $relation = null)
我看到你传递给你的函数的第二个参数Cuentas :: belongsTo()是&#39; id_cuentos&#39; 但是在班级Bancos中,主键属性表示主键的名称是“#id;”。
protected $primaryKey = 'id';
它有什么不对吗?
答案 2 :(得分:0)
public function Banco()
是一个belongsTo
关系,它将返回一个Bancos
对象 - 而不是它们的集合。因此,当您在该对象上调用->fist()
时,它不是Collection::fist()
函数 - 它是Bancos::first()
。这就是为什么你总是从Bancos模型中获得第一个条目的原因。
在你的foreach循环中,$banco
是一个Cuentas对象。 $banco->banco
是您需要的相关Bancos对象。因此,如果您的$banco
对象中有一个属性Bancos
,那么您需要在模板中调用
{{ $banco->banco->banco }}
正如其他人在答案中提到的那样,您应该将Banco()
重命名为banco()
或致电{{ $banco->Banco->banco }}
。
作为旁注:您的命名风格非常混乱。为什么要拨打Cuentas
集合$bancos
?
我会重命名一些东西:
function Banco()
=&gt; function banco()
array('bancos' => $results)
=&gt; array('cuentas' => $results)
@foreach($bancos as $banco)
=&gt; @foreach($cuentas as $cuenta)
{{ $banco->banco->banco }}
=&gt; {{ $cuenta->banco->banco }}
此外(如果可能)我会将属性Bancos::banco
重命名为Bancos::name
,以便您可以在不混淆审核人的情况下致电{{ $cuenta->banco->name }}
。
答案 3 :(得分:-1)
我非常确定事情是区分大小写的,你在模型中使用Banco,在视图中使用banco。