【问题标题】:(Laravel) Get data from a table which an ID correspond with another table that link with that table(Laravel)从一个表中获取数据,该表的 ID 对应于与该表链接的另一个表
【发布时间】:2017-07-05 05:57:02
【问题描述】:

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

我有 3 张桌子(实际上我还有更多,但让我们忽略它),我有 standardsstddetailssections,如图所示:-

所以外键对应如下:-

  • 来自表 standards 的列 stdPK = 来自表的列 stdFK stddetails

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

场景是这样的:-

假设我有一个 $id 与表 standards 中的 stdPK 匹配使用 $id,我需要从表 sections 中获取所有数据。问题是,我找不到正确的查询,因为 standardssections 表都只与 stddetails 表链接。

目前我在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:-

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

$stdsec = Stddetail::with('section')->find($id);

所有数据都是从stddetailssections 表中检索的,现在的问题是在显示页面中难以显示来自sections 表中ssctionName 列的数据,因为它返回错误。

展示页面相关代码如下:-

@foreach ($stdsec as $task)
       {{strtoupper($task->ssctionName)}}
@endforeach

显示的错误:-

我认为雄辩的方法很好,现在显示部分给我带来了麻烦。关于如何解决这个问题的任何想法?

更新 2:-

这是每个表的模型:-

standards作为标准模型:-

namespace App;

use Illuminate\Database\Eloquent\Model;

class Standard extends Model
{

    public $primaryKey = 'stdPK';

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

Table stddetails as Stddetail 模型:-

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');
    }

}

Table sections 作为 Section 模型:-

namespace App;

use Illuminate\Database\Eloquent\Model;

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

【问题讨论】:

  • 这不是数据库的预期使用方式。但是您可以使用 pk 作为外键进行一些连接。
  • 看看关系?属于/有很多?
  • @ThomasMoors Owh,不知道..实际上有很多表相互链接,但在我目前正在处理的页面上,使用这 3 个表..
  • 来自 XAMPP 的@KirkBeard MySQL,对不起...
  • @senty 我没有查看关系,因为不是我创建了数据库。它对查询至关重要吗?

标签: php mysql database laravel


【解决方案1】:

看看雄辩的关系:https://laravel.com/docs/5.4/eloquent-relationships

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

在不相关的说明中,我建议改进您的命名约定。使用所有缩写词和短名称来理解事件基本链接真的很难

【讨论】:

  • “Eloquent 将为您创建所需的查询”是什么意思?我认为我们需要自己创建查询...我确实在每个表的模型中设置了关系...
  • 表示使用ORM的整个目的,就像Eloquent。您“只是”使用所谓的流畅语法编写代码,如果您的关系设置正确,您将能够仅使用模型获取所有数据。
  • 例如:$details = Standards::with('stddetails')->find($id); 将返回具有集合类型属性 stddetails 的标准模型。您不必编写 SQL 查询,Eloquent 为您完成了这些。它的目的是从您那里抽象出该层,这样您就可以编写代码(对不起,关于两个 cmets,我太快按 Enter,所以不会让我编辑第一条评论)
  • 我已经阅读了文档并设置了每个模型中的所有关系,但是在“查询关系”之前,我没有得到应该放置查询的位置。它在路线、控制器或模型中吗?另外,回到我原来的问题,如果可能的话,你能用雄辩的方法向我提供查询吗?我对它有点模糊......
  • @Kaydarin,您不必放置文字 sql 查询。您只需要“雄辩”的查询 - 您可以将其放在任何地方(它与系统设计有关),但大多数时候人们将它们放入控制器中。无论如何,如果您希望以雄辩的方式进行查询,则首先需要一个模型..
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多