【问题标题】:Can't get hasmany tables in laravel 5.1 eloquent无法在 laravel 5.1 eloquent 中获取 hasmany 表
【发布时间】:2017-11-21 07:26:45
【问题描述】:

我在 Laravel eloquent 中获取 hasmany 关系数据时遇到问题。

AModel 有许多 BModel AModel 有很多 CModel

AModel 具有功能:

Public function bmodels(){
    return hasMany('BModel');
}

Public function cmodels(){
    return hasMany('CModel');
}

BModel 有功能:

Public function bmodels(){
    return belongsTo('AModel', amodel_id);
}

CModel 有功能:

Public function cmodels(){
    return belongsTo('AModel',amodel_id);
}

现在我正在尝试像这样得到它

$amodels = AModel::with('bmodels','cmodels')
        ->where('status_id','2200')
        ->whereIn('eventstatus_id',['1','2'])
        ->get();

现在我想在 for 循环中测试它。

foreach($amodels as $amodel){
    $bmodels = $model->bmodels();
    if ($amodel && $amodel->end < Carbon::now()){
        foreach ($bmodels as $bmodel){
            $cmodels = $amodel->cmodels();
            foreach($cmodels as $cmodel){
                if ($bmodel->id !== $cmodel->reservation_id || $cmodel->reservation_id != null ){
                    array_push($reservation_needed_to_enter,$bmodel->id);
                }
            }

        }
    }
}

【问题讨论】:

  • 要访问这些模型,只需在 foreach 循环中编写 $amodel->bmodels 而不是 $amodel->bmodels()。
  • 感谢现在的作品
  • 你能接受它作为答案吗?然后我会发布一个答案
  • 我怎么能接受我看不到任何答案
  • 好的,我正在发布它..

标签: php mysql laravel orm eloquent


【解决方案1】:

你应该在你的Models中进行更改,使用$this来使用belongsTohasMany,就像

public function bmodels(){
    return $this->belongsTo('App\AModel','amodel_id');
}
public function bmodels(){
    return $this->hasMany('App\BModel');
}

刚刚编辑了您的foreach loop,使用$amodel-&gt;bmodels 而不是$amodel-&gt;bmodels()

 foreach($amodels as $amodel){
        $bmodels = $amodel->bmodels;
        if ($amodel && $amodel->end < Carbon::now()){
            foreach ($bmodels as $bmodel){
                $cmodels = $amodel->cmodels;
                foreach($cmodels as $cmodel){
                    if ($bmodel->id !== $cmodel->reservation_id || $cmodel->reservation_id != null ){
                        array_push($reservation_needed_to_enter,$bmodel->id);
                    }
                }

            }
        }
    }

【讨论】:

    【解决方案2】:

    在你的AModel中替换这两个函数

    Public function bmodels(){
        return hasMany('BModel');
    }
    
    Public function cmodels(){
        return hasMany('CModel');
    }
    

    public function bmodels(){
        return $this->hasMany('App\BModel');
    }
    
    public function cmodels(){
        return $this->hasMany('App\CModel');
    }
    

    这些函数在BMOdelCModel 中作为

    public function bmodels(){
        return $this->belongsTo('App\AModel','amodel_id');
    }
    
    public function cmodels(){
        return $this->belongsTo('App\AModel','amodel_id');
    }
    

    【讨论】:

    • 不,我不明白这里的问题是什么
    • 其实所有模型都是同名的,你应该给模型名称加上完整的路径,并使用$this对象来引用当前对象
    【解决方案3】:

    如果您的模型存储在默认目录中,您可能应该这样做:

    public function bmodels()
    {
        return $this->hasMany('App\BModel');
    }
    

    AModel 中是否有一个名为 cmodels 的函数,如果没有,这可能是问题所在。因为您正在尝试获取AModel::with('bmodels','cmodels'),但如果其中一个不存在,它将无法正常工作。

    这个if ($amodel &amp;&amp; $amodel-&gt;end &lt; Carbon::now()){ 对我来说没有意义。因为$amodel 将始终是Eloquent\Model 的一个实例,并且永远不会是错误的或您要在那里检查的任何内容。但也许它是有目的的..

    如何在您的.blade 文件中访问您的BModel

    @foreach($aModel->bmodels() as $bModel)
       {{$bModel->id}}
    @endforeach()
    

    【讨论】:

    • 当我尝试获取 hasmany 模型的属性时,出现错误。例如,如果我喜欢 amodel->bmodels->id get error 我在 foreach 循环中这样做
    • 因为 bmodels 是 HasMany 关系,所以这不起作用。尝试像我在我编辑的答案中所做的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2016-01-01
    • 1970-01-01
    • 2016-03-09
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多