Php 尝试在laravel中定义一对多关系时出错
我试图在laravel中定义一个一对多关系,其中我有一个Php 尝试在laravel中定义一对多关系时出错,php,laravel,laravel-5,Php,Laravel,Laravel 5,我试图在laravel中定义一个一对多关系,其中我有一个Movimentacao类和一个TipoMovimentacaoFin。一个Movimentacao是一个TipoMovimentacaoFin类型,一个TipoMovimentacaoFin可以有多个Movimentacao。为此,我在他们的模型中声明: class Movimentacao extends Model { public $timestamps = false; public function tipo(){ r
Movimentacao
类和一个TipoMovimentacaoFin
。一个Movimentacao
是一个TipoMovimentacaoFin
类型,一个TipoMovimentacaoFin
可以有多个Movimentacao
。为此,我在他们的模型中声明:
class Movimentacao extends Model
{
public $timestamps = false;
public function tipo(){
return $this->belongsTo('Patropi\TipoMovimentacaoFin', 'tipo', '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');
});
现在,当我试图访问moviementacao
的类型(tipo)时,问题开始出现在视图中。我使用$movimentacaos=Movimentacao::with('tipo')->orderBy('data_prevista','desc')->get()
给视图提供集合,当我循环@foreach($movimentacaos as$mov)
时,如果我访问$mov->tipo
,我会得到movimentacaos.tipo列的值,这是预期的。如果我试图访问给定$mov
的tipo_movimentacao_fins
的某列,我无法:
{{ $mov->tipo()->relacionado_empresa }}
给出未定义属性的错误。因此,由于laravel的文档有点混乱,我试图分析->tipo()
调用的返回结果,出现了更多错误:
如果我只是写{{$mov->tipo()}}
它会给我一个错误“htmlspecialchars()期望参数1是字符串,给定对象”
如果{!!$mov->tipo()!!}
给出“类的对象illumb\Database\elount\Relations\BelongsTo无法转换为字符串”
如果{var_export($mov->tipo())}
给出“var_export不处理循环引用”
最后,如果我尝试一个var_转储,它会给出允许的内存大小134217728字节(尝试分配98582528字节)
另外,在如何访问BelongsTo对象实例方面也没有太大帮助
编辑我按照答案和评论中的建议编辑了代码,但同样的问题仍然存在。应该属于与正确FK定义的关系:
public function tipo()
{
return $this->belongsTo('App\TipoMovimentacaoFin', 'tipo');
}
另一种关系应该是这样的:
public function movimentacaos()
{
return $this->hasMany('App\Movimentacao', 'tipo');
}
如果
tipo
位于moviementacaos
表中,并指向tipomoviementacaofins
表中的id
,则此操作有效。您的关系不好。应该是:
class Movimentacao extends Model
{
public $timestamps = false;
public function tipo(){
return $this->belongsTo('App\TipoMovimentacaoFin', 'tipo');
}
}
以及:
请看一下也许您需要使用id:return$this->hasOne('App\TipoMovimentacaoFin','tipo','id')<代码>返回$this->hasMany('App\Movimentacao','tipo',)代码>应该是
返回$this->hasMany('App\Movimentacao','tipo')代码>。有一个逗号会引起一个错误谢谢你的回答,但我仍然有相同的errors@Kyonhiss这是因为当您查询数据时,您不使用关系<代码>$movimentacaos=Movimentacao::orderBy('data_prevista','desc')->get()
应该是$movimentacaos=Movimentacao::with('tipo')->orderBy('data_prevista','desc')->get()
也不起作用。我将编辑我的OP以发布我代码的更多详细信息
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');
}
}