2020-11-18 15:20:01 186次浏览 3条回答 0 悬赏 10 金钱

由于业务原因导致数据库设计嵌套关系太多,有的场景需要查询多张表才可以,实现,目前2种解放方案

方案1:使用 yii2 自带的 hasOne 和 hasMany

public function getRecipe()
{
    return $this->hasOne(Recipe::className(), ['id' => 'recipe_id']);
}

public function getMealMaterials()
{
    return $this->hasMany(MealMaterial::className(), ['meal_detail_id' => 'id']);
}

public function getMaterials()
{
    return $this->hasMany(Material::className(), ['id' => 'material_id'])
        ->via('mealMaterials');
}

22.png

方案2:直接使用原生sql查询

$userOneDayMeal = MealDetail::find()
    ->select([
        'meal_detail.id as meal_detail_id',
        'meal_detail.stage',
        'meal_detail.recipe_id',
        'meal_detail.plate',
        'meal_material.weight',
        'recipe.name',
        'image.path as image',
        'material.name as material_name',
        'material.energy'
    ])
    ->leftJoin('recipe', "recipe.id = meal_detail.recipe_id")
    ->leftJoin('image', "image.id = recipe.image_id")
    ->leftJoin('meal_material', "meal_material.meal_detail_id = meal_detail.id")
    ->leftJoin('material', "material.id = meal_material.material_id")
    ->where(
        ['and',
            ['meal_detail.meal_id'=>$mealId],
            ['meal_detail.day'=>$day],
        ]
    )
    ->orderBy(['stage' => SORT_ASC, 'plate' => SORT_ASC,])
    ->asArray()->all();

11.png

备注:那种实现方式好,目前没有考虑缓存啥的

补充于 2020-11-18 15:21

原生 SQL 比使用 Yii2 自带的 hasOnehasMany

Yii用户专享10000元红包

Yii开发者福利,万元红包可用于云服务器、高防服务器、裸金属服务器、云数据库、高防IP购买和续费

  • 回答于 2020-11-18 16:28 举报

    你可以打开debug看看使用hasOne和hasMany建立关系之后,进行查询的SQL是怎样的
    对照之后,也许你会有答案。

    1 条回复
    回复于 2020-11-18 16:58 回复

    我改成第二种原生的了,速度比之前第一种快多了

  • 回答于 2020-11-18 16:58 举报

    想学YII容易吗

    2 条回复
    回复于 2020-11-19 11:06 回复

    容易,不难,php都是世界上最简单的语言,框架不是更简单,各种封装,我们都是拿来主义

    回复于 2020-11-20 09:58 回复

    @刘冲💯 这话被你说的,稀碎

  • 回答于 2020-11-20 09:58 举报

    直接写sql 然后让DBA优化

您需要登录后才可以回答。登录 | 立即注册
刘冲💯
助理

刘冲💯

注册时间:2017-10-16
最后登录:2020-11-24
在线时长:2小时10分
  • 粉丝1
  • 金钱120
  • 威望0
  • 积分140

热门问题