Php (Laravel)从一个表中获取数据,该表的ID对应于与该表链接的另一个表

Php (Laravel)从一个表中获取数据,该表的ID对应于与该表链接的另一个表,php,mysql,database,laravel,Php,Mysql,Database,Laravel,我在玩我的第一个Laravel项目,我上面的问题可能有点困惑,但让我解释一下:- 我有3个表(实际上我有更多的表,但让我们忽略它),我有标准,标准细节,部分,如图所示: 因此,外键对应如下所示:- 表中的列stdPK标准=表中的列stdFK stddetails 列ssctionPK来自表sections=列ssctionFK来自 表stddetails 情况是这样的:- Route::get('getstddtl/{id?}', function ($id) { $stdse

我在玩我的第一个Laravel项目,我上面的问题可能有点困惑,但让我解释一下:-

我有3个表(实际上我有更多的表,但让我们忽略它),我有
标准
标准细节
部分
,如图所示:

因此,外键对应如下所示:-

  • 表中的列
    stdPK
    标准=表中的列
    stdFK
    stddetails

  • ssctionPK
    来自表
    sections
    =列
    ssctionFK
    来自
    stddetails

情况是这样的:-

Route::get('getstddtl/{id?}', function ($id) {

     $stdsec = Section::
            leftJoin('stddetails', 'ssctionFK', '=', 'ssctionPK')
            ->join('standards', function($join) use ($id){
                $join->on('stdPK', '=', 'stdFK')
                        ->where('stdFK', $id);
            });

    return view('standarddtl', [
        'stdsec' => $stdsec

    ]);
});
假设我有一个
$id
要在表
标准
中的
stdPK
上匹配使用该
$id
,我需要从表
部分获取所有数据。问题是,我找不到正确的查询,因为
标准
表都只与
stddetails
表链接

当前我在my
web.php
中的查询是:-

Route::get('getstddtl/{id?}', function ($id) {

     $stdsec = Section::
            leftJoin('stddetails', 'ssctionFK', '=', 'ssctionPK')
            ->join('standards', function($join) use ($id){
                $join->on('stdPK', '=', 'stdFK')
                        ->where('stdFK', $id);
            });

    return view('standarddtl', [
        'stdsec' => $stdsec

    ]);
});
我想这应该很容易,孩子。。。我错了。。。我希望有人能帮我,因为我的大脑思维能力非常有限

更新1:-

我在每个模型中设置了雄辩的关系,并使用Laravel的雄辩方法检索数据:-

$stdsec = Stddetail::with('section')->find($id);
所有数据都是从
stddetails
部分
表格中检索的,现在的问题是在显示页面中显示
部分
表格中
中的数据时遇到困难,因为该列返回错误

显示页面上的相关代码如下所示:-

@foreach ($stdsec as $task)
       {{strtoupper($task->ssctionName)}}
@endforeach
错误显示为:-

我认为雄辩的方法是好的,现在显示部分给我带来了麻烦。有没有办法解决这个问题

更新2:-

以下是每个表的模型:-

标准
标准型号:-

namespace App;

use Illuminate\Database\Eloquent\Model;

class Standard extends Model
{

    public $primaryKey = 'stdPK';

    public function stddetail()
    {
        return $this->hasMany(Stddetail::class, 'stdFK', 'stdPK');
    }
}
namespace App;

use Illuminate\Database\Eloquent\Model;

class Stddetail extends Model
{
    public $table = "stddetails";
    public $primaryKey = 'sdtlPK';
    protected $fillable = ['stdFK', 'sdtlPgNo', 'sdtlLnNo', 'sdtlText', 'sdtlShrtnote', 'sdtlSchm', 'svrFK', 'ssctionFK', 'sdtlRefLbl'];

    public function standard()
    {   
        return $this->belongsTo(Standard::class, 'stdFK');
    }

    public function section()
    {   
        return $this->belongsTo(Section::class, 'ssctionFK');
    }

}
namespace App;

use Illuminate\Database\Eloquent\Model;

class Section extends Model
{
    public $primaryKey = 'ssctionPK';
    public function stddetails()
    {
        return $this->hasMany(Stddetail::class, 'ssctionFK', 'ssctionPK');
    }
}
stddeails
作为stddeail模型:-

namespace App;

use Illuminate\Database\Eloquent\Model;

class Standard extends Model
{

    public $primaryKey = 'stdPK';

    public function stddetail()
    {
        return $this->hasMany(Stddetail::class, 'stdFK', 'stdPK');
    }
}
namespace App;

use Illuminate\Database\Eloquent\Model;

class Stddetail extends Model
{
    public $table = "stddetails";
    public $primaryKey = 'sdtlPK';
    protected $fillable = ['stdFK', 'sdtlPgNo', 'sdtlLnNo', 'sdtlText', 'sdtlShrtnote', 'sdtlSchm', 'svrFK', 'ssctionFK', 'sdtlRefLbl'];

    public function standard()
    {   
        return $this->belongsTo(Standard::class, 'stdFK');
    }

    public function section()
    {   
        return $this->belongsTo(Section::class, 'ssctionFK');
    }

}
namespace App;

use Illuminate\Database\Eloquent\Model;

class Section extends Model
{
    public $primaryKey = 'ssctionPK';
    public function stddetails()
    {
        return $this->hasMany(Stddetail::class, 'ssctionFK', 'ssctionPK');
    }
}
章节
章节型号:-

namespace App;

use Illuminate\Database\Eloquent\Model;

class Standard extends Model
{

    public $primaryKey = 'stdPK';

    public function stddetail()
    {
        return $this->hasMany(Stddetail::class, 'stdFK', 'stdPK');
    }
}
namespace App;

use Illuminate\Database\Eloquent\Model;

class Stddetail extends Model
{
    public $table = "stddetails";
    public $primaryKey = 'sdtlPK';
    protected $fillable = ['stdFK', 'sdtlPgNo', 'sdtlLnNo', 'sdtlText', 'sdtlShrtnote', 'sdtlSchm', 'svrFK', 'ssctionFK', 'sdtlRefLbl'];

    public function standard()
    {   
        return $this->belongsTo(Standard::class, 'stdFK');
    }

    public function section()
    {   
        return $this->belongsTo(Section::class, 'ssctionFK');
    }

}
namespace App;

use Illuminate\Database\Eloquent\Model;

class Section extends Model
{
    public $primaryKey = 'ssctionPK';
    public function stddetails()
    {
        return $this->hasMany(Stddetail::class, 'ssctionFK', 'ssctionPK');
    }
}

看看雄辩的人际关系:

您应该能够在模型(表)之间设置适当的关系(hasMany、belongsTo等),并用一个命令获取所有数据(elount将为您创建所需的查询)


另一方面,我建议改进您的命名约定。很难理解使用了所有首字母缩略词和短名称的事件基本链接

这不是使用数据库的方式。但你们可以用pk作为外键进行一些连接。看看关系吧?“属于/有很多吗?”托马斯穆斯Owh,我不知道。。实际上,有很多表相互链接,但在我目前正在处理的一个页面上,使用了这3个表。@KirkBeard MySQL来自XAMPP,对不起…@senty我没有查看关系,因为数据库不是我创建的。。它对查询至关重要吗?你说的“雄辩会为你创建所需的查询”是什么意思?我认为我们需要自己创建查询。。。我确实在每个表的模型中设置了关系…这就是使用ORM的全部目的,就像雄辩一样。您正在使用所谓的流畅语法“仅仅”编写代码,如果您的关系设置正确,您将能够使用模型获取所有数据。例如:
$details=Standards::with('stddetails')->find($id)
将返回集合类型的属性stddetails的标准模型。您不必编写SQL查询,Eloquent为您做到了这一点。它的目的是从您那里抽象出该层,这样您就可以编写代码了(很抱歉,有两条注释,我太快按了enter键,所以不允许我编辑第一条注释)。我已经阅读了文档并设置了每个模型中的所有关系,但在“查询关系”之前,我不知道查询应该放在哪里。是在路线、控制器还是模型中?另外,回到我最初的问题,如果可能的话,你能用雄辩的方法向我提供这个问题吗?我有点迷糊了…@Kaydarin,你不必把一个字面的sql查询。。你只需要“有说服力的”查询——你可以把它放在任何地方(这与系统设计有关),但大多数时候人们把它们放在控制器中。无论如何,如果你想让这个查询有说服力,你首先需要一个模型。。