试图在laravel中定义一对多关系的错误

时间:2017-12-28 15:18:40

标签: php laravel laravel-5

我正在尝试在laravel中定义一对多关系,其中我有一个Movimentacao类和一个TipoMovimentacaoFin。一个Movimentacao 是一个类型TipoMovimentacaoFin,而TipoMovimentacaoFin 可以有多个 Movimentacao个与之关联。为此,我在他们的模型中声明:

class Movimentacao extends Model
{
public $timestamps = false;

public function tipo(){
    return $this->belongsTo('Patropi\TipoMovimentacaoFin', 'tipo', 'tipo');
 }
}

class TipoMovimentacaoFin extends Model
{
public $timestamps = false;

public function movimentacaos(){
    return $this->hasMany('App\Movimentacao', 'id', 'tipo');

  }
}

在数据库级别,我得到了:

tipo_movimentacao_fins.tipo(varchar)作为PK加上其他列,并将movimentacaos.tipo作为FK添加到第一个表中。表格的名称由Laravel标准自动生成。表的迁移是:

Schema::create('tipo_movimentacao_fins', function (Blueprint $table) {
        $table->string('tipo', 50);
        $table->char('relacionado_empresa', 1);
        $table->char('entrada_saida', 1);
        $table->primary('tipo');
    });

Schema::create('movimentacaos', function (Blueprint $table) {
        $table->increments('id');
        $table->float('montante', 12, 2);
        $table->dateTime('data_prevista');
        $table->dateTime('data_vencimento')->nullable();
        $table->char('esta_pago', 1);
        $table->float('juros', 6, 2)->nullable();
        $table->smallInteger('periodo_juros')->nullable();
        $table->string('tipo', 50);
        $table->string('referente_a', 255);
        $table->string('obs', 255)->nullable();

        $table->foreign('tipo')->references('tipo')->on('tipo_movimentacao_fins');
    });

现在,当我尝试访问Movimentacao的类型(tipo)时问题从View开始。我使用$movimentacaos = Movimentacao::with('tipo')->orderBy('data_prevista', 'desc')->get()来查看集合,当我循环@foreach($movimentacaos as $mov)时,如果我访问$mov->tipo,我会得到movimentacaos.tipo列的值,这是预期的。如果我尝试访问给定tipo_movimentacao_fins的{​​{1}}的某些列,我就不能:

$mov

提供未定义属性错误。所以,由于laravel的文档有点混乱,我试图分析{{ $mov->tipo()->relacionado_empresa }} 调用返回的内容并发生更多错误:

如果我只是写->tipo(),它会给我错误“ htmlspecialchars()期望参数1为字符串,对象给定”。

如果{{ $mov->tipo() }}给出“类Illuminate对象\数据库\ Eloquent \ Relations \ BelongsTo无法转换为字符串”。

如果{!! $mov->tipo() !!}给出“ var_export不处理循环引用”。

最后,如果我尝试一个var_dump,它会使允许的内存大小为134217728字节耗尽(试图分配98582528字节)

Laravel docs对于如何访问BelongsTo对象实例也没有太多帮助。;

编辑我按照答案和评论中的建议编辑了代码,但同样的问题仍然存在。

2 个答案:

答案 0 :(得分:0)

它应该是属于与正确的FK定义的关系:

public function tipo()
{
    return $this->belongsTo('App\TipoMovimentacaoFin', 'tipo');
}

另一种关系应该是这样的:

public function movimentacaos()
{
    return $this->hasMany('App\Movimentacao', 'tipo');
}

如果tipo位于movimentacaos表格中并指向id表格中的tipomovimentacaofins,则此方法有效。

答案 1 :(得分:0)

你们的关系很糟糕。应该是:

class Movimentacao extends Model
{
public $timestamps = false;

public function tipo(){
    return $this->belongsTo('App\TipoMovimentacaoFin', 'tipo');
 }
}

和:

class TipoMovimentacaoFin extends Model
{
public $timestamps = false;

public function movimentacaos(){
    return $this->hasMany('App\Movimentacao', 'tipo');
  }
}

请查看DOCs