Laravel 4.2中的雄辩关系问题

时间:2016-05-23 21:17:45

标签: php mysql laravel laravel-4 eloquent

我在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>

但它总是在表格中显示第一个银行的名称而不是相关的名称。

感谢任何帮助

4 个答案:

答案 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。