【问题标题】:How to foreach a hasMany relationship in Laravel 6如何在 Laravel 6 中获取 hasMany 关系
【发布时间】:2020-04-29 19:56:32
【问题描述】:

我正在使用 Laravel 6,我想在 Layanan 模型和 Objek 模型之间建立一个 hasMany 关系

拉亚南模型

class Layanan extends Model
{
    protected $fillable = ['nama_layanan'];
    protected $primaryKey = 'layanans_id';

    public function objeks()
    {
        return $this->hasMany(Objek::class);
    }
}

对象模型

class Objek extends Model
{
    protected $fillable = ['layanan_id', 'tipe_objeks'];
    protected $primaryKey = 'objeks_id';

    public function layanan()
    {
        return $this->belongsTo(Layanan::class);
    }
}

Controller.php

class ObjekController extends Controller
{
    public function object()
    {
        $objek = \App\Objek::all();

        return view('pages.alat.object.object')->with('data', $objek);
    }
}

查看

@foreach ($data as $item)
    @foreach ($item->layanan as $layanan)
        <tr>
            <td>{!! $item->objeks_id !!}</td>
            <td>{!! $layanan->layanan_id !!},</td>
            <td>{!! $item->tipe_objeks !!}</td>
            <td>{!! $item->created_at->format('d/m/Y') !!}</td>
            <td>{!! $item->updated_at->format('d/m/Y') !!}</td>
        </tr>
    @endforeach
@endforeach

我得到了错误

为 foreach() 提供的参数无效

我做错了什么?有时,它说 'layanan' 是非对象。

【问题讨论】:

  • 您正在尝试在 belongsTo 中检索,即重新运行表的单个实例,最好提及 2 个表的关系,我们可以为您提供正确的代码

标签: laravel eloquent laravel-6


【解决方案1】:
class Objek extends Model
{
    protected $fillable=[
        'layanan_id', 'tipe_objeks'
    ];
    protected $primaryKey = 'objeks_id';

    public function layanan() {
        return $this->hasMany(Layanan::class,'layanan_id','layanan_id');
    }
}

如果你把 Objek hasManylayanan

那么只有你可以循环 1 行 Objek

点赞$data = Objek::find(1(=);

foreach($data as $layanan)

【讨论】:

  • 我收到此错误“SQLSTATE[42S22]: Column not found: 1054 Unknown column 'layanans.objek_objeks_id' in 'where 子句' (SQL: select * from layanans where layanans.@ 987654327@ = 1 和 layanans.objek_objeks_id 不为空)"
  • 我想要得到的查询是“select * from objeks where objeks.layanan_id = layanans.id”,但它却给了我像上面的评论一样的查询
  • @agastyarimbawa 你可以给找到的数据提供第二个参数,就像我更新我的代码一样,它可能是错误的,但你应该知道
【解决方案2】:

只需更新您的视图,如下所示添加 if 条件来检查每条记录是否存在关系值。

@foreach ($data as $item)
    @if($item->layanan->count())
        @foreach ($item->layanan as $layanan)
            <tr>
                <td>{!! $item->objeks_id !!}</td>
                <td>{!! $layanan->layanan_id !!},</td>
                <td>{!! $item->tipe_objeks !!}</td>
                <td>{!! $item->created_at->format('d/m/Y') !!}</td>
                <td>{!! $item->updated_at->format('d/m/Y') !!}</td>
            </tr>
        @endforeach
    @endif
@endforeach

【讨论】:

  • 抱歉回复晚了,我试过上面的代码,它给了我这个错误Call to a member function count() on null 。所以这意味着我的 Layanan 和 Objek 模型之间没有任何关系?
  • 您的课程没有正确的关系。您需要将这两个关系函数重写为public function layanan() { return $this-&gt;hasMany(Layanan::class); } public function objeks() { return $this-&gt;belongsTo(Objek::class); }
【解决方案3】:

我的问题正是你遇到的问题。我无法从 hasMany 关系中循环收集。

我通过将数据转换为对象而不是集合来解决。

public function convertToObject($data) {
    return json_decode(json_encode($data), FALSE);
}
public function object() {
    $objek = \App\Objek::all();
    $objek = $this->convertToObject($objek);

    return view('pages.alat.object.object')->with('data', $objek);
}

【讨论】:

    【解决方案4】:

    当您定义关系时,它将采用 id as PK,因此良好的做法是定义 FK 和 PK,如下所示

    class Layanan extends Model
    {
        protected $fillable=[
            'nama_layanan'
        ];
    
        protected $primaryKey = 'layanans_id';
    
        public function objeks() {
            return $this->hasMany('App\Objek', 'layanan_id', 'layanans_id');
        }
    }
    

    那么你需要使用IF()

    @foreach ($data as $item) 
       @if(isset($item->layanan))  ////    @if($item->layanan && is_array($item->layanan))  or   @if(count($item->layanan) > 0)         
       @foreach ($item->layanan as $layanan)
    
       @endforeach
       @endif
    @endforeach
    

    更新

    根据您的关系,如果您从 Objek 获取数据,然后像这样使用

    @foreach ($data as $item) 
    
           <tr>
                <td>{!! $item->objeks_id !!}</td>
                <td>{!! $item->layanan->layanans_id !!},</td>
                <td>{!! $item->tipe_objeks !!}</td>
                <td>{!! $item->created_at->format('d/m/Y') !!}</td>
                <td>{!! $item->updated_at->format('d/m/Y') !!}</td>
            </tr>
    
    
    @endforeach
    

    【讨论】:

    • 我做了上面的代码,它没有给我错误,但是在我的DataTables中,它说我在Objeks Table中没有数据,同时我已经在phpmyadmin中手动插入了2个数据。现在有什么问题? @Hamelraj
    • 嘿检查你的关系Layanan -&gt; Objek 1:N 但你使用$objek = \App\Objek::all(); 这么混乱??
    • 那么,我需要使用什么来代替$objek = \App\Objek::all();?使用 Objek::all() 时我想到的逻辑;是模型对象(从对象中选择 *)与模型 Layanan 内部连接。
    猜你喜欢
    • 2015-11-29
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2014-03-02
    • 2021-11-19
    • 2017-04-28
    相关资源
    最近更新 更多