当前位置: 首页 > 知识库问答 >
问题:

获取数据库信息的更好方法

毛博
2023-03-14

好的,我有一个座位系统,它生成一个30x30的网格,对于每个网格,数据库中都有一行,但是当我在我的页面上生成这个网格时,我当前每个元素发出5个SQL请求(有900个元素),我们都知道这不是最优的。

为了呈现它,我执行一个while循环,并执行一些检查,然后回显出以下代码:

<li class="seat" @if(Seat::showTitle($id) == 1) data-toggle="tooltip" data-placement="left" title="" data-original-title="{{ Seat::title($id) }}" @endif><a class="{{ Seat::getCSSClass($id) }}">@if(Seat::showTitle($id) == 1) {{ Seat::seatID($id) }} @endif</a></li>

下面是一个座椅模型如何工作的例子

<?php

class Seat extends Eloquent {

    protected $fillable=array('user_id','timestamp','temp_user_id','temp_timestamp', 'class', 'seat_id', 'seat_name');

    protected $table = 'seats';

    public static $classes =    array(
                    "blank" => array(
                        "css_class"     => "seating_blank",
                        "can_reserve"   => 0,
                        "show_title"    => 0,
                        "title"         => "Blank"
                    ),
                    "available" => array(
                        "css_class"     => "seating_green",
                        "can_reserve"   => 1,
                        "show_title"    => 1,
                        "title"         => "Ledig"
                    ),
                    "reserved" => array(
                        "css_class"     => "seating_grey",
                        "can_reserve"   => 0,
                        "show_title"    => 1,
                        "title"         => "Reserveret"
                    ),
                    "taken" => array(
                        "css_class"     => "seating_red",
                        "can_reserve"   => 0,
                        "show_title"    => 1,
                        "title"         => "Betalt og Reserveret"
                    ),
                    "temp_taken" => array(
                        "css_class"     => "seating_orange",
                        "can_reserve"   => 0,
                        "show_title"    => 1,
                        "title"         => "Reservation igangsat"
                    )

                );


    public static function getCSSClass($seat) 
    {
        $theSeat = Self::where('id', '=', $seat)->first();

        if($theSeat) {
            $class = $theSeat->class;

            return Self::$classes[$class]['css_class'];
        } else {
            return NULL;
        }
    }

    public static function canReserve($seat) 
    {
        $theSeat = Self::where('id', '=', $seat)->first();

        if($theSeat) {
            $class = $theSeat->class;

            return Self::$classes[$class]['can_reserve'];
        } else {
            return NULL;
        }
    }

    public static function showTitle($seat) 
    {
        $theSeat = Self::where('id', '=', $seat)->first();

        if($theSeat) {
            $class = $theSeat->class;

            return Self::$classes[$class]['show_title'];
        } else {
            return NULL;
        }
    }
    public static function title($seat) 
    {
        $theSeat = Self::where('id', '=', $seat)->first();

        if($theSeat) {
            $class = $theSeat->class;

            return Self::$classes[$class]['title'];
        } else {
            return NULL;
        }
    }

    public static function seatID($seat)
    {
        $theSeat = Self::where('id', '=', $seat)->first();

        if($theSeat) {
            return $theSeat->seat_id;
        } else {
            return NULL;
        }
    }

    public static function seatName($seat)
    {
        $theSeat = Self::where('id', '=', $seat)->first();

        if($theSeat) {
            return $theSeat->seat_name;
        } else {
            return NULL;
        }
    }

    public static function classTitle($class)
    {
        return Self::$classes[$class]["title"];
    }

    public static function userID($seat)
    {
        $theSeat = Self::where('id', '=', $seat)->first();

        if($theSeat) {
            return $theSeat->user_id;
        } else {
            return NULL;
        }
    }

    public static function getClass($seat)
    {
        $theSeat = Self::where('id', '=', $seat)->first();

        if($theSeat) {
            return $theSeat->class;
        } else {
            return NULL;
        }
    }


}

每个请求中有5个这样的函数,这对许多人来说是一种方式。所以我需要一些好的方法来最小化这个系统的SQL负载。

共有2个答案

文自怡
2023-03-14

解决问题的部分方法可能是让showtitle函数使用Laravel的where函数,这样您就可以让SQL查询对ID数组进行操作,而不是1乘1。这可以大幅减少SQL查询的数量。

下面是我以前基本使用过的一个示例。
因此,在这个示例中,您将使用某个循环首先创建$arrayofgroups,然后将其用作where的参数

        $result = DB::table('users')
        ->whereIn('group',$arrayOfGroups)
        ->get();

我认为你可以在你的情况下做类似的事情。

柴飞星
2023-03-14

您的模型应该如下所示:

class Seat extends Eloquent {

    protected $fillable = array('user_id','timestamp','temp_user_id','temp_timestamp', 'class', 'seat_id', 'seat_name');

    protected $table = 'seats';

    private $classes =  array(
                    "blank" => array(
                        "css_class"     => "seating_blank",
                        "can_reserve"   => 0,
                        "show_title"    => 0,
                        "title"         => "Blank"
                    ),
                    "available" => array(
                        "css_class"     => "seating_green",
                        "can_reserve"   => 1,
                        "show_title"    => 1,
                        "title"         => "Ledig"
                    ),
                    "reserved" => array(
                        "css_class"     => "seating_grey",
                        "can_reserve"   => 0,
                        "show_title"    => 1,
                        "title"         => "Reserveret"
                    ),
                    "taken" => array(
                        "css_class"     => "seating_red",
                        "can_reserve"   => 0,
                        "show_title"    => 1,
                        "title"         => "Betalt og Reserveret"
                    ),
                    "temp_taken" => array(
                        "css_class"     => "seating_orange",
                        "can_reserve"   => 0,
                        "show_title"    => 1,
                        "title"         => "Reservation igangsat"
                    )

                );

    public static function getSeats() 
    {
        $seats = $this->all(); //get all seats you may want to add some where clause
        return $this->prepareData($seats);
    }

    private function prepareData($seats) 
    {
        foreach ($seats as $key => $seat) 
        {
            $seats[$key]->css_class = $this->classes[$seat->class]['css_class'];
            $seats[$key]->can_reserve = $this->classes[$seat->class]['can_reserve'];
            $seats[$key]->show_title = $this->classes[$seat->class]['show_title'];
            $seats[$key]->title = $this->classes[$seat->class]['title'];
        }
        return $seats;
    }

}

鉴于此,您希望执行以下操作:

@foreach ($seats as $seat)
   <li class="seat" 
        @if($seat->show_title) data-toggle="tooltip" data-placement="left" title="" data-original-title="{{ $seat->title }}" @endif>
        <a class="{{ $seat->css_class }}">@if($seat->show_title) {{ $seat->id }} @endif</a>
    </li> 
@endforeach

和控制器示例为:

$seats = Seats::getSeats();
return view('whatever')->withSeats($seats);
 类似资料:
  • DBMetas() xorm支持获取表结构信息,通过调用 engine.DBMetas() 可以获取到数据库中所有的表,字段,索引的信息。 TableInfo() 根据传入的结构体指针及其对应的Tag,提取出模型对应的表结构信息。这里不是数据库当前的表结构信息,而是我们通过struct建模时希望数据库的表的结构信息

  • 代码起作用了。至少在我试过的文件中。但这似乎是一种糟糕的方式,但我还没有找到更好的解决方案,所以如果你有一个,请分享:)

  • 问题内容: 每次我尝试使用ffmpeg获取有关我的视频文件的信息时,都会吐出很多无用的信息,混杂着很多好东西。 我正在使用。 有没有可能以友好的方式实现这一目标?我的意思是JSON会很棒(甚至丑陋的XML也可以)。 至此,我使我的应用程序使用正则表达式解析数据,但是在某些特定的视频文件上却出现了很多讨厌的角落。我已修复所有遇到的问题,但可能还会更多。 我想要类似的东西: 问题答案: 有点晚了,但也

  • 在我的项目中,我正在从数据库/sql迁移到金珠/gorm。以前,我用方法捕获了我的数据库情况。我想知道如何在GORM中实现这一点?我在官方文件中什么也没找到。

  • 本文向大家介绍json获取数据库的信息在前端页面显示方法,包括了json获取数据库的信息在前端页面显示方法的使用技巧和注意事项,需要的朋友参考一下 ajax发送请求到controller,controller响应一个json格式的数据给页面, JSON.parse()再解析json字符串,用$.each遍历。 以上这篇json获取数据库的信息在前端页面显示方法就是小编分享给大家的全部内容了,希望能

  • 如果你忘记数据库或表的名字,或给定的表的结构是什么(例如,它的列叫什么),怎么办?MySQL通过提供数据库及其支持的表的信息的几个语句解决这个问题。 你已经见到了SHOW DATABASES,它列出由服务器管理的数据库。为了找出当前选择了哪个数据库,使用DATABASE( )函数: mysql> SELECT DATABASE(); +------------+ | DATABASE() | +-