我正在尝试在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对象实例也没有太多帮助。;
编辑我按照答案和评论中的建议编辑了代码,但同样的问题仍然存在。
答案 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