【问题标题】:Error(s) trying to define a one-to-many relationship in laravel尝试在 laravel 中定义一对多关系时出错
【发布时间】: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');

标签: php laravel laravel-5


【解决方案1】:

你们的关系不好。应该是:

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

【讨论】:

  • 感谢您的回答,但我仍然有同样的错误
  • @Kyonhiss 是因为当您查询数据时,您不使用关系。 $movimentacaos = Movimentacao::orderBy('data_prevista', 'desc')->get() 应该是 $movimentacaos = Movimentacao::with('tipo')->orderBy('data_prevista', 'desc')->get()
  • 也没有用。我将编辑我的 OP 以发布我的代码的更多详细信息
【解决方案2】:

它应该是正确的FK定义的belongsTo关系:

public function tipo()
{
    return $this->belongsTo('App\TipoMovimentacaoFin', 'tipo');
}

另一个关系应该是这样的:

public function movimentacaos()
{
    return $this->hasMany('App\Movimentacao', 'tipo');
}

如果tipomovimentacaos 表中并指向tipomovimentacaofins 表中的id,这将起作用。

【讨论】:

  • return $this->hasMany('App\Movimentacao', 'tipo',); 应该是 return $this->hasMany('App\Movimentacao', 'tipo');。有一个逗号会报错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2021-08-28
相关资源
最近更新 更多