【发布时间】:2017-12-28 15:18:40
【问题描述】:
我正在尝试在 laravel 中定义一对多关系,其中我有一个 Movimentacao 类和一个 TipoMovimentacaoFin。一个Movimentacao 是一个 类型TipoMovimentacaoFin 和一个TipoMovimentacaoFin 可以有很多 Movimentacao(s) 与之关联。为此,我在他们的模型中声明:
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) 时,问题开始出现在视图中。我使用$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\Database\Eloquent\Relations\BelongsTo 的对象无法转换为字符串”。
如果{{ var_export($mov->tipo()) }} 给出“var_export 不处理循环引用”。
最后,如果我尝试使用 var_dump,它会给出 允许的内存大小为 134217728 字节用尽(尝试分配 98582528 字节)
此外,Laravel docs 在如何访问 BelongsTo Object 实例方面也没有太大帮助。;
编辑我按照答案和 cmets 中的建议编辑了代码,但同样的问题仍然存在。
【问题讨论】:
-
可能需要用到id:return $this->hasOne('App\TipoMovimentacaoFin', 'tipo', 'id');