laravel中查询语句
来源:互联网 发布:mac看照片怎么下一张 编辑:程序博客网 时间:2024/05/21 06:33
1 常见的数据库表关系
One-To-One //一对一One-To-Many //一对多Many-To-Many //多对多
在刚刚开始接触到这些概念的时候,其实我是不太理解的。但是一旦你将这些概念应用到生活中,理解起来就很简单了,就举一个与我们在网上经常见到的例子:
User-To-Profile // One-To-OneUser-To-Articles // One-To-ManyArticles-To-Tags // Many-To-Many
翻译过来就是:
- 一个用户对应一个用户档案
- 一个用户可以发表多篇文章
- 文章和标签确实多对多的关系,一篇文章可以有多个标签;一个标签可以属于多篇文章
在这些关系模型中,最难实现的就是Many-To-Many这种多对多的关系,不过借助Laravel的强大的Eloquent,实现这个功能还是比较顺心的。
2 创建数据库表
创建Question.php数据库模型时,同时也创建一个Questions迁移文件
php artisan make:model Question -m
Quesrtions.php
2017_02_02_072801_create_questions_table.php
创建questions表
Schema::create('Questions', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->text('content'); $table->timestamps(); });
创建Topic.php数据库模型,同时也创建一个Topics数据库迁移文件
php artisan make:model Topic -m
Topics.php
2017_02_02_072801_create_Topics_table.php
创建topics表
Schema::create('tags', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); });
当然,解决这个经典问题单单靠这两张表还不足够,需要在这两张表之外再建立一个关系表,用来将article和tag联系起来,在Laravel中,如果你遵循官方的标准规则,第三张表应该是这样的:
创建 question_topic迁移文件
php artisan make:migration create_articles_tags_table --create=question_topic
生成一个迁移文件
2017_06_08_235159_create_questions_topics_table.php
创建question_topic
Schema::create('question_topic', function (Blueprint $table) { $table->increments('id'); $table->integer('question_id')->unsigned()->index(); $table->integer('topic_id')->unsigned()->index(); $table->timestamps(); });
如果你没有按照官方的规范来,你需要在模型中指定外键。
3. 创建模型并指定关系
在Topic.php中:
class Topic extends Model{ protected $fillable = ['name','questions_count']; public function questions() { //这里的数据库模型为Question数据模型 return $this->belongsToMany(Question::class)->withTimestamps() }
在Question.php中:
class Question extends Model{ protected $fillable = ['title','body', 'user_id']; public function topics() { //这里的数据库模型为Topic数据模型 return $this->belongsToMany(Topic::class)->withTimestamps() }
这里注意两点:
你可以在声明关系的时候指定外键,如
$this->belongsToMany(Topic::class,'foreign_key', 'other_key');
或者传递第二个数据库表的表名作为第二个参数(your_table_name)
return $this->belongsToMany(Topic::class,'your_table_name')->withTimestamps()
如果在article_tag表中你添加了timestamps(),即表中出现created_at和updated_at这两个字段,在Article中声明关系的时候需要这样:
return $this->belongsToMany(Topic::class)->withTimestamps();
4 在Controller中使用
如果我们想查看某个提问含有哪些话题,我们可以这样:
$question= Question::find($id);dd($question->topic);
如果我们想通过某个话题下面有多少个提问:
public function showArticleByTagName($name) { $topic= Topic::where('value','=',$name)->first(); dd($topic->questions); }
以上,就实现了在Laravel中的Many-To-Many
转自https://segmentfault.com/a/1190000002982984
- laravel中查询语句
- Laravel SQL 查询语句集锦
- Laravel SQL 查询语句集锦
- laravel中经典sql语句!
- laravel 中获取执行的sql语句
- laravel中复杂的sql查询
- Laravel获取最近的SQL查询语句Queries
- Laravel 在 with 查询中只查询个别字段
- laravel中打印sql语句到日志中
- laravel中把查询数据库的sql写入日志中
- laravel查询构造器中别名的问题
- MongoDB+laravel 查询mongodb集合中数组个数
- 关于laravel model中关联查询的命名问题
- laravel中使用from_unixtime对查询日期格式化
- laravel中数据库查询leftJoin应注意的问题
- Laravel SQL查询中first、pluck、lists方法的使用
- oracle 中递归查询语句
- Informix 中分页查询语句
- codevs 1214 线段覆盖
- Synchronized 互斥块(对象锁) 一个对象和一个monitor 的关系
- 第43课: Spark 1.6 RPC内幕解密:运行机制、源码详解、Netty与Akka等
- 好久不写了
- 如何快速下载DockerToolbox?使用国内开源镜像站点
- laravel中查询语句
- Centos7 安装SVN
- QFileDialog 的各种属性设置介绍
- Qt5.5 QFileDialog类的使用方法
- js 简单计算器
- [BZOJ3209]花神的数论题
- php加密
- 学生成绩管理系统(结构体版)
- 添加样式