Php 尝试在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

我试图在laravel中定义一个一对多关系,其中我有一个
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');
  }
}