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

问题描述 投票:3回答:2

我正试图在laravel中定义一对多关系,我有一个Movimentacao类和一个TipoMovimentacaoFin。一个Movimentacao是一种类型TipoMovimentacaoFinTipoMovimentacaoFin可以有许多与之相关的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$mov的某些列,我不能:

{{ $mov->tipo()->relacionado_empresa }}

给出未定义的属性错误。因此,由于laravel的文档有点混乱,我试图分析->tipo()调用的返回是什么,并发生更多错误:

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

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

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

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

此外,Laravel docs在如何访问BelongsTo Object实例方面没有太多帮助。

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

php laravel laravel-5
2个回答
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


0
投票

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

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

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

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

如果tipomovimentacaos表中并且指向id表中的tipomovimentacaofins,这将起作用。

© www.soinside.com 2019 - 2024. All rights reserved.