Php (Laravel)从一个表中获取数据,该表的ID对应于与该表链接的另一个表
我在玩我的第一个Laravel项目,我上面的问题可能有点困惑,但让我解释一下:- 我有3个表(实际上我有更多的表,但让我们忽略它),我有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
标准
,标准细节
,部分
,如图所示:
因此,外键对应如下所示:-
- 表中的列
标准=表中的列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
表链接
当前我在myweb.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查询。。你只需要“有说服力的”查询——你可以把它放在任何地方(这与系统设计有关),但大多数时候人们把它们放在控制器中。无论如何,如果你想让这个查询有说服力,你首先需要一个模型。。