我正试图在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
的$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实例方面没有太多帮助。
编辑我按照答案和评论中的建议编辑了代码,但同样的问题仍然存在。
你的关系很糟糕。应该:
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
它应该是belongsTo与正确的FK定义的关系:
public function tipo()
{
return $this->belongsTo('App\TipoMovimentacaoFin', 'tipo');
}
另一种关系应该是这样的:
public function movimentacaos()
{
return $this->hasMany('App\Movimentacao', 'tipo');
}
如果tipo
在movimentacaos
表中并且指向id
表中的tipomovimentacaofins
,这将起作用。