精华内容
下载资源
问答
  • laravel表查询

    千次阅读 2020-06-01 21:06:21
    表查询得有张有联系的数据表,(除了自己连接自己的,自联查询) 案例:创建个表,进行关联查询(使用laravel的数据迁移) 创建个表,article表和author表。 (1)使用php artisan的命令创建迁移文件 在...

    联表查询得有两张有联系的数据表,(除了自己连接自己的,自联查询)


    案例:创建两个表,进行关联查询(使用laravel的数据迁移)

    	创建两个表,article表和author表。
    

    (1)使用php artisan的命令创建迁移文件
    在laravel文件目录下打开命令行窗口,输入下面命令,回车。

    //创建article表迁移文件
    #php artisan make:migration create_article_table
    //创建author表迁移文件
    #php artisan make:migration create_author_table
    

    (2)编写两个迁移文件的代码
    在create_article_table的迁移文件中的up方法里写入下面创建表的字段

     public function up()
        {
            Schema::create('article', function (Blueprint $table) {
            //主键自增
                $table->bigIncrements('id')->comment('主键');
                //作者名字,vachar类型,字段长度50,唯一
                $table->string('article_name',50)->unique()->comment('文件名称');
                //作者的id
    			$table->tinyInteger('author_id')->comment('作者id');
            });
        }
    

    在create_author_table的迁移文件中的up方法里写入下面创建表的字段

      public function up()
        {
            Schema::create('author', function (Blueprint $table) {
            //主键自增
              $table->bigIncrements('id')->comment('主键');
              //作者名字
              $table->string('author_name')->comment('作者name');
            });
        }
    

    上面两个迁移文件up方法中编写的id是相互关联的!

    (3)执行生成数据表的迁移文件
    命令行窗口输入:php artisan migrate
    执行以后,数据表中就会有article和author表,并且有上一步在迁移文件里写的字段
    (4)模拟数据的填充(通过填充器来实现)
    创建填充器文件:
    在项目的命令行窗口中编写创建填充器代码:php artisan make:seeder ArticleAndAuthorTableSeeder

    创建完成以后,在databases/seeds/里有刚创建的文件(ArticleAndAuthorTableSeeder)。
    打开编写,进行模拟数据的填充:

     public function run()
        {
            //article里进行数据填充
            DB::table('article')->insert(
            		[
                  [
                      'article_name'		=>'怎么保养皮肤',
                      'author_id'		=>rand(1,5),
    
                  ],
                  [
                     'article_name'		=>'怎么减肥',
                     'author_id'		=>rand(1,5),
                    ],
                  [
                      'article_name'		=>'自律给我自由',
                      'author_id'		=>rand(1,5),
                    ],
                  [
                    'article_name'		=>'学霸养成记',
                    'author_id'		=>rand(1,5),
                    ],
            		]
            );
            //author表里进行数据填充
            DB::table('author')->insert(
            		[
                  [
                      'author_name'     =>'张三',
    
                  ],
                  [
                    'author_name'     =>'李四',
                    ],
                  [
                      'author_name'     =>'王五',
                    ],
                  [
                   'author_name'     =>'刘六',
                    ],
            		]
            );
        }
    

    填充完以后,执行填充器文件,命令行输入:php artisan db:seed --class=ArticleAndAuthorTableSeeder

    执行完以后,article表里和author表里就有填充的文件了
    在这里插入图片描述
    在这里插入图片描述


    然后进行联表查询:


    链表的方式: 内联和外联(左外联,右外联)
    用链式操作进行链接:
    (1)创建路由;

    //联表查询
    Route::get('duobiaoselect','TestController@duobiaoselect');
    
    

    (2)编写控制器代码;

    
    //联表查询
    public function duobiaoselect(){
        /*
        把sql语句改写成链式操作,实现效果
        select t1.id,t1.article_name as article_name,t2.author_name as
        author_name from article as t1 left join author as t2 on t1.author_id = t2.id;
        语法:DB门面 -> join联表方式名称小驼峰写法(关联的表名,表1的字段,运算符,表2的字段)
        */
       $data=DB::table('article as t1')
                ->select('t1.id','t1.article_name','t2.author_name')
                ->leftjoin('author as t2','t1.author_id','=','t2.id')
                ->get();
    
       dump($data);
    }
    
    

    (3)直接访问,就可以查询到内容了
    在这里插入图片描述

    展开全文
  • Laravel联合表查询使用join造成的性能问题Laravel联合表查询使用join造成的性能问题具体问题然后是join那该怎么做?意外的学习:paginate导致的性能问题最终结论 Laravel联合表查询使用join造成的性能问题 问题背景...

    Laravel联合表查询使用join造成的性能问题

    问题背景:公司某单个页面查询速度缓慢,一次查询8~12秒一次,被拉去做优化,优化之后2s

    具体问题

    项目使用了4个join和查询了一堆用不到的数据,首先先把不需要的去掉,结果是并不会有多大的速度提升。因为你从一个表里取一列数据还是很多列数据其实它已经在这之前进行全表搜寻了(假设无索引状态),比如 select a from c where c.id = d.id,无论你最后select 出来了a还是a,b,没有很大影响。

    然后是join

    参考

    https://blog.csdn.net/jhgdike/article/details/55052064 Mysql为什么不建议使用join
    https://www.cnblogs.com/BeginMan/p/3754322.html Mysql Join语法解析与性能分析
    https://my.oschina.net/jun24bryant/blog/787375 sql语句中join on和where用法的区别和联系

    如果你不想理解on 和 where在 join的区别和优先顺序,更不想写一大堆join最后把自己写蒙了。更更不想你好不容易写出来之后结果其实是负优化。最好不要用join(尤其是left join)

    去掉一个left join改为with,就是现在的2s了,是不是感觉 就这?

    那该怎么做?

    Eloquent里 return $this->hasMany or hasOne(你要链接的表::class, ‘两个你想查找’,‘的表的关联的键’)(如’id’, ‘patient_id’)->select(‘你要找出来的东西’)
    然后在控制器里with一下这个function。其实就是去mysql里select xxxx where akey=bkey 而join是会生成中间表。在这里理解的不太好,抱歉,时间比较紧迫。

    意外的学习:paginate导致的性能问题

    通过查看sql慢查询发现,每一次访问数据paginate会生成两条sql语句,其中一条是访问会count(*) 查看总条数,如果你联合了很多表,这可能会导致很慢。然后又学习到了其实count(*)的速度并不会比加了索引的count(id)速度慢,因为count(*)不会取值

    下面是教程, 不想仔细看可以不看 ->
    count()是一个聚合函数,对于返回的结果集,一行行地判断,如果count函数的参数不是NULL,累计值就加1,否则不加。最后返回累计值。
    count的用法有多种,分别是count(*)、count(字段)、count(1)、count(主键id)。那么多种用法,到底有什么差别呢?当然,前提是没有where条件语句。
    count(id):InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。server层拿到id后,判断是不可能为空的,就按行累加。
    count(1):InnoDB引擎遍历整张表,但不取值。server层对于返回的每一行,放一个数字1进去,判断是不可能为空的,按行累加。
    count(字段):

    如果这个“字段”是定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累加;
    如果这个字段定义允许为null,那么执行的时候,判断到有可能是null,还要把值取出来再判断一下,不是null才累加。
    count():不会把全部字段取出来,而是专门做了优化,不取值。count()肯定不是null,按行累加。
    所以结论很简单:按照效率排序的话,count(字段)<count(主键id)<count(1)≈count(),所以建议读者,尽量使用count()。
    注意:这里肯定有人会问,count(id)不是走的索引吗,为什么查询效率和其他的差不多呢?陈某在这里解释一下,虽然走的索引,但是还是要一行一行的扫描才能统计出来总数。

    https://www.cnblogs.com/kehoudaan/p/12631571.html Mysql性能优化:为什么你的count(*)这么慢?

    最终结论

    如果还需要继续优化的话会想着解决一下paginate的问题。但绝对不是用简单分页里压根不查询总页这么2的解决方案,因为解决问题的方案绝对不是删掉整个问题。我目前的想法是缓存下查询到的总页在之后的访问不再访问(当然如果你的数据在频繁改变就不好用了)。
    在这个问题出现之初查到的方案总是在说分库分表,加索引。优化sql的问题一定要先从语句有没有问题开始,没有问题就索引,再不行再分表,分库,再再不行再换库,mysql做好优化绝对性能不止如此。如果你语句性能都不行,问题很多,你光想着给我换一个天河一号跑起来是不是就不卡了,真的不能叫程序员。请叫土大款。

    (mysql深入了解过后会发现要知道的事情可太多了,还要注意eloquent里语句的执行顺序,我曾经以为paginate写在后面会导致查询到所有数据后再limit,其实paginate执行顺序倒数第二。。。,会先收集到你写的所有语句,然后按照顺序转化为sql语句再执行下去,我还在那里吹说我发现了奇点。)最后的最后。实习生一枚,如有错误,请直接指出,我喜欢学习错误,感谢。

    展开全文
  • laravel表查询表查询 leftjoin

    千次阅读 2019-02-19 10:47:06
    // start查找订单中是特殊商品的 返现返现时间不是一年而是是自己控制的 $speceal_order=\App\BaseOrderModel::leftjoin('ys_sub_order','ys_sub_order.base_id','=','ys_base_order.id') -&...
    // start查找订单中是特殊商品的 返现返现时间不是一年而是是自己控制的
       $speceal_order=\App\BaseOrderModel::leftjoin('ys_sub_order','ys_sub_order.base_id','=','ys_base_order.id')
         ->leftjoin('ys_order_goods','ys_sub_order.id','=','ys_order_goods.sub_id')
         ->leftjoin('ys_goods','ys_goods.id','=','ys_order_goods.goods_id')
         ->leftjoin('ys_goods_class','ys_goods_class.id','=','ys_goods.class_id')
          ->where('ys_base_order.state',1)
          ->where('ys_sub_order.receive_state',1)
          ->where('ys_sub_order.all_rebate','>',0)
          ->where('ys_sub_order.back_state',0)
          ->groupBy('ys_base_order.user_id')
           ->select('ys_order_goods.*','ys_goods.class_id','ys_goods_class.first_id')
           ->get();
    
           @file_put_contents($path.'/speceal_order.txt', print_r($speceal_order,true));
    展开全文
  • 可如果有个多个表查询起来不久很麻烦了嘛,所以这个时候我们可以借助一下 Laravel 模型里的一个方法,别名(实际上 原生SQL 语句也可使用此方法,但此文章不讲述其原理) 假设的一种数据表关联 表名 关联字段 ...

    假设如今我们正在做一个系统,这个系统是属于订票那一类的航班或者车票系统。 然后搜索功能里有出发城市和目的城市等两个搜索条件。
    如果我们的航线是直接对标城市的话,那么搜索其实挺简单的,只是个两个表关联查询。 可如果有个多个表查询起来不久很麻烦了嘛,所以这个时候我们可以借助一下 Laravel 模型里的一个方法,别名(实际上 原生SQL 语句也可使用此方法,但此文章不讲述其原理)

    假设的一种数据表关联

    表名关联字段
    Trains(火车表)lines_id
    Lines(线路表)from_station_id , to_station_id
    Stations(站点表)city_id
    Cities(城市表)id

    好,看完上面的表后我们可以大致理解 Trains -> Lines -> Stations -> Cities 这几个表的关系
    (一辆火车所行使的一条路上,他的起点站和终点站都是属于某个城市里的某一个站点)。

    关联 Trains 与 Lines

    那么我们去建立一个模型 – Trains,并且与 Lines 表关联查询,查询完后我们的火车便与他所行驶的路线数据关联起来了

    		Trains::join("lines","lines.id","=","trains.lines_id")
                ->get();
    

    然后我们从上面的表里可以得知,Lines 表有两个字段是关联到 Stations 表的,假设如果是直接关联到 Cities 表,那么客户传过来的 出发城市id 和到达城市id 我们直接对应就好了。可问题是 Lines 表 直接关联的Stations 表,而只有 Stations 表是关联到城市表的。

    (那么你能直接这样吗? = . =)

    		Trains::join("lines","lines.id","=","trains.lines_id")
                ->join("stations","stations.id","=","lines.from_station_id")
                ->join("stations","stations.id","=","lines.to_station_id")
                ->get();
    

    那肯定是不行的对吧?

    因为我们没办法正确区分哪个是出发站点的信息,哪个是到达站点的信息,这个时候,别名就派上用场了

    		Trains::join("lines","lines.id","=","trains.lines_id")
                ->join("stations as stations_from","stations_from.id","=","lines.from_station_id")
                ->join("stations as stasions_to","stasions_to.id","=","lines.to_station_id")
                ->get();
    

    这个样子我们就能正确判断哪个是出发站点的信息,哪个是到达站点的信息了,然后只需要稍微限制一下。就能得到我们限定的出发城市到目的城市里的线路了

    那么最终代码如下

    		Trains::join("lines","lines.id","=","trains.lines_id")
                ->join("stations as stations_from","stations_from.id","=","lines.from_station_id")
                ->join("stations as stasions_to","stasions_to.id","=","lines.to_station_id")
                ->select([
                    "trains.*",
                    "lines.*",
                ])
                ->where([
                        ["stations_from.city_id",$from],
                        ["stasions_to.city_id",$to],
                    ])
                ->get();
                /* select 表示你在前端要输出的数据有哪些 */
    
    展开全文
  • 查询构建器还可以用于编写基本的SQL“内连接”,你可以使用查询构建器实例上的join方法,传递给join方法的第一次参数是你需要连接到的表名,剩余的其它参数则是为连接指定的列约束,www.bojiesz.com 当然,正如你所...
  • laravel表查询数据的一些常用方法

    万次阅读 2018-08-26 00:06:42
    但是会出现一个问题,如果我旗下的门店没有进行订单的交易,那么这个查询就无法查到旗下这家门店,因为join连接,必须是共有东西才能出来,所以此查询表现出弱关系(上述说到!) $data = User::store()...
  • Laravel嵌套子查询 临时

    千次阅读 2019-10-25 16:41:46
    Lavavel嵌套子查询 临时笔者需求表格情况原始SQL实现原始SQL性能分析图使用Laravel框架实现遇到的问题与解决方式Laravel生成的SQL最终实现了Laravel框架中,基于DB类使用一个查询语句,完成查询需求。 笔者需求 ...
  • laravel的联表查询

    2021-04-19 16:34:36
    本文目录一、联表查询1.1 创建迁移文件1.2 执行迁移文件1.3 模拟数据(通过填充器)1.4 联表查询例子二、关联模型(重点)2.1 一对一关系2.2 一对多关系2.3 多对多关系(抽象) 一、联表查询 联表要求至少得有2张表...
  • $xk = DB::table('articles') ->where('status',2) ->where('title', 'like', "%$keyword%") ->select('id', 'title','title as utitle','published_at','status as search_status','status','search_...
  • laravel利用联合查询个数据按照某一字段排序 在项目中需要把的数据按照时间进行排序,需要利用mysql的查询 代码: $tourist = Tourist::query() -&amp;gt;select('id', 'name as customer_...
  • 今天小编就为大家分享一篇laravel model 两表联查示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • laravel——联表查询

    2020-06-02 20:24:07
    表查询 联表要求至少有2张表(除了自己连接自己),并且还得存在关系的张表 例如:可以建立2张表,文章表、作者表 文章表(article) id 主键 article_name 文章名称 author_id 作者(作者id) 作者表(author)...
  • laravel框架联表查询

    2020-06-02 08:31:00
    前面我们进行过数据的迁移与填充,而如果我们想实现在个表数据进行关联的查询这时候我们就需要用到联表查询; 联表查询的方式有多种: 分为三种连接查询: 1.内连接 使用比较运算符(包括=、>、<、<>...
  • laravel数据库查询 首先 先添加路由 Route::prefix('datebase')->group(function() { Route::get('insert', "DatebaseController@insert"); Route::get('get', "DatebaseController@get"); }); get...
  • laravel join 关联查询

    千次阅读 2019-04-26 09:38:21
    1、两表关联 $fbaInventoryTb = (new \App\Model\Amz\Fba\InventoryReport)->getTable(); $productTb = (new \App\Model\Amz\Product)->getTable(); $twInventoryTb = (new \App\Model\T...
  • Laravel连接,多个查询(Eloquent)

    千次阅读 2019-05-15 10:24:28
    1.(写此文章理由) 最近工作用laravel ,然而我不会laravel,工作快四年了,初次使用compose,初次使用git,学习laravel。工作这次做一个查询,如图下,本来下SQL的话很快,但是用Eloquent 2.要写的sql ,用Eloquent...
  • 关于Laravel的多表查询方法

    万次阅读 2015-12-18 12:05:40
    之前写了一个遇到了多表查询的问题,现在就来写一下: $data = DB::table('stu_searches') //将张表拼接起来 ->join('stu_msgs', function($join) { $join->on('stu_searches.stu_id', '=', 'stu_...
  • Laravel Eloquent ORM查询

    千次阅读 2018-09-25 22:27:00
    find()使用主键查询一行数据 User::select('id','name')-&amp;amp;amp;amp;gt;find($id); first()加上where条件选取第一行数据 User::where('id',$id)-&amp;amp;amp;amp;gt;first(); #注意如果...
  • 首先需要建立关联关系 public function records() { return $this->hasMany('App\Model\Admin\RecordExpert'); } public function expert() { return $this->...查询 ExpertInfo::select(['i..
  • Laravel的数据库查询生成器为创建和运行数据库查询提供了方便,流畅的界面。 它可用于在应用程序中执行大多数数据库操作,并在所有受支持的数据库系统上工作。 Laravel查询构建器使用PDO参数绑定来保护您的应用程序...
  • <p>This is the query but I don't know how to implement it in Laravel <pre><code>SELECT orders. * , payments. * FROM orders INNER JOIN payments ON orders.user_id = payments.userID WHERE orders.user_...
  • 1、简介 ...注意:Laravel查询构建器使用PDO参数绑定来避免SQL注入攻击,不再需要过滤传递到绑定的字符串。 2、获取结果集 2.1 从一张中取出所有行 在查询之前,使用DB门面的table方法,tab
  • Laravel框架中连表查询

    千次阅读 2020-09-08 09:54:05
    表查询 联表要求至少得有2张表(除了自己连接自己),并且还是存在关系的张表。 例如:可以建立2张表:文章表、作者表。 文章表(article): Id 主键 Article_name 文章名称 Author_id 作者(作者id...
  • 1.在laravel查询中,我们需要查找个字段相等的值,这种方法不行 $data = DB::connection('mysql_branch')-&gt;table('branches') -&gt;where('is_usable',1) -&gt;whereRaw('money','amount')-&...
  • laravel model 两表联查

    万次阅读 2017-11-24 10:06:15
     模型数据库会以  user_id  作为外键。如果想要更改这个默认,可以传入第二个参数到  hasOne  方法里。更进一步,您可以传入第三个参数,指定关联的外键要对应到本身的哪个字段: return $this - > has...
  • laravel框架sql查询

    2020-11-14 15:04:45
    查询一条数据返回的对象 //get()返回中所有数据 $res=DB::table(‘student’)->get(); //first()返回结果集中的第一条数据 $res=DB::table(‘student’)->where(‘id’,‘1001’)->first(); //value()...
  • laravel框架的联表查询

    2020-06-02 17:50:59
    表查询的方式有多种: 分为三种连接查询: 1.内连接 使用比较运算符(包括=、>、<、<>、>=、<=、!> 和!<)进行表间的比较操作,查询与连接条件相匹配的数据。根据所使用的比较方式不同,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,657
精华内容 1,062
关键字:

laravel两表查询