如何将两个表与中间表连接起来并收集数据?

How can I join Two Tables with and intermediate Table and gather data?

提问人:MOHAMED KESSOUM 提问时间:6/25/2023 更新时间:6/26/2023 访问量:47

问:

我正在做一个项目,我需要使用来自 Laravel Doc Has Many Through 将数据从表 A 检索到表 C 的数据,并以表 B 为中间体。HasManyThrough

我有三个表 Categorie 和 Produit,这是 realtionship:
Categorie --> Hasmany Sous_Categorie -->Hasmany Produits
CategorieSous

And this is my tables 
Categorie:
   - id
   - name
Sous_categorie:
   - id
   - categorie_id
   - name
Produits:
   - id
   - sous_categorie_id
   - name 

这是我的模型

Categorie.php

class Categorie extends Model
{
public function souscategories()
    {
        return $this->hasMany(Sous_categorie::class, 'sous_categorie');
    }

    public function produits()
    {
        return $this->hasManyThrough(Produit::class, Sous_categorie::class);
    }
}

Sous_Categorie.php

class Sous_categorie extends Model
{ 
public function categories(){
        return $this->belongsTo(Categorie::class,'categorie_id','id');
    }

    public function produits(){
        return $this->hasMany(Produit::class,'produit');
    }
}

Produit.php

class Produit extends Model
{
public function souscategories()
    {
        return $this->belongsTo(Sous_categorie::class, 'sous_categorie_id', 'id');
    }
}

我还添加了:

protected $fillable = [
        'filenames',
        'title',
        'nom',
        'sous_categorie_id',
        'categorie_id',
        'id',
        'id'

    ];

我试图做的是根据 和 ID 从指定的类别中获取所有产品,例如:

我已经打电话了,一个属于有很多我想检索的。categoriePC PARTSSous_categoriePC PARTSProduits

我希望我的问题很清楚,提前致谢。

我试图像这样加入关系produitssouscategories.categoriescategorie_id

$s_produits = Produit::with('souscategories.categories')->where('categorie_id','like','%'.$id.'%')->get();

我收到此错误:SQLSTATE[42S22]:找不到列:1054 未知列“categorie_id”在“where clause”(SQL:从“produits”中选择 *,其中“categorie_id”,如 %1%)

如果我尝试以下代码:

$s_produits = Produit::with('souscategories.categories')->get(); 

它检索所有可用的产品

在这里
输入图片描述,我不想要我想要某个类别的所有产品

Laravel 关系 laravel-query-builder

评论


答:

0赞 xenooooo 6/25/2023 #1

我看到您想根据表中筛选模型?您可以在以下位置添加约束:Produitcategorie_idsouscategorieswith()

use Illuminate\Contracts\Database\Eloquent\Builder;

Produit::with(['souscategories' => function (Builder $query) use ($id) {
    $query->where("categorie_id","LIKE", %{$id}%);
}])->get();

约束 Eager Loads 在这里作为参考。

评论

0赞 MOHAMED KESSOUM 6/25/2023
它没有用,你能更具体一点吗
0赞 MOHAMED KESSOUM 6/25/2023
错误 App\Http\Controllers\SousCategorieController::App\Http\Controllers\{closure}(): 参数 #1 ($query) 必须为 Illuminate\Contracts\Database\Eloquent\Builder 类型,
0赞 MOHAMED KESSOUM 6/26/2023 #2

我想出了如何将表 A 与表 B 与表 C 和中间表连接起来。 所以我有表有很多有很多我试图根据带有此代码的类别名称检索所有产品:categoriessous_categoriesproduits

public function show(Sous_categorie $sous_categorie, $id)
{
    //
    $s_produits = DB::table('produits')
    ->select('produits.*', 'sous_categories.categorie_id as laravel_through_key')
    ->join('sous_categories','sous_categories.id','=','produits.sous_categorie_id')
    ->whereIn('sous_categories.categorie_id',[$id])
    ->get();
}

它在 156 毫秒的查询持续时间下工作正常,如果我能让它更简单,请告诉我。