Eloquent Relationship(一对多,一对一)
程序员文章站
2022-04-19 10:15:28
...
前提数据库的数据
users表id name email password remember_token created_at updated_at1 123456 123@qq.com $2y$10$EfEo1gCcK6JdwgxjqjNbK.fVZjgu7i68uKMPqNwBX9VpNVuvgthm6 wSaR4V256k4xxisbbiVNS1o9iEqwCaIDZB5Nk5YZYj5JNBENIiowTALrBNNT 2016-05-25 15:31:07 2016-05-25 15:41:53articles表id title content publish_at created_at updated_at user_id1 title content 2016-05-14 18:04:44 2016-05-14 18:04:48 2016-05-14 18:04:48 1--------------------------------id title content publish_at created_at updated_at user_id2 title2 content2 2016-05-15 04:24:48 2016-05-14 18:07:42 2016-05-14 18:07:42 1
user_id作为了默认的外键名称,因为user表里面的主键是id,laravel的eloquent模块自动处理了这些,他在自己本身里面维护了一个外键的关联关系。
一对一的关系
例如,一个User模型有一个与之对应的article模型,一个用户有一篇文章
app/User.php public function articles-one(){ return $this->hasOne('App\Articles'); //用hasOne方法,这个方法是laravel提供的,直接在model里面使用 //传入参数是另外一个model,这里是抽象化,解析出来其实就是一个表和另外一个表的一对一的关联 }
用命令行工具tinker演示
php artisan tinkerPsy Shell v0.7.2 (PHP 5.5.34 — cli) by Justin Hileman>>> $user = App\User::first();=> App\User {#691 id: 1, //这个是user的主键,其实就是users表的主键 name: "123456", email: "123@qq.com", created_at: "2016-05-25 15:31:07", updated_at: "2016-05-25 15:41:53", }>>> $user->articles-one; //调用刚才写的articles-one方法,写这个方法目的就是在这里,在实例化这个model的时候,添加一个可以操作的方法,然后实现我们自己需要的设计。=> App\Articles {#692 id: 1, title: "title", content: "content", publish_at: "2016-05-14 18:04:44", created_at: "2016-05-14 18:04:48", updated_at: "2016-05-14 18:04:48", user_id: 1, //自动默认关联的是user model的id键,这是laravel的默认设定,关联后会自动生成 model名+主键的外键 //这样就代表了这篇文章是属于id为1的用户的。 }>>>
如果不想默认,想自定义外键名称的话, return $this->hasOne('App\Articles', 'foreign_key', 'local_key');传入一个foreign_key的参数,然后后面再加一个你的自定义键就好了。
一对多的关系
一个User模型有一个与之对应的article模型,一个用户有多篇文章
app/User.php public function articles(){ //为了方便区分,将articles-one 改为articles,代表很多文章,而不只是一篇 return $this->hasMany('App\Articles'); }
用命令行工具tinker演示
php artisan tinkerPsy Shell v0.7.2 (PHP 5.5.34 — cli) by Justin Hileman>>> $user = App\User::find(1);=> App\User {#693 id: 1, name: "123456", email: "123161769@qq.com", created_at: "2016-05-25 15:31:07", updated_at: "2016-05-25 15:41:53", }>>> $articles = App\User::find(1)->articles; //find方法是laravel默认提供的,查询方法使用方式就知道,传入的是id参数,所以这里的意思是找到id为1的所有数据 //然后通过链式方式,继续在原来的基础上过滤结果,执行articles方法,组合起来就会返回属于用户id为1的所有文章 //其实相当于写select * from articles where user_id = 1;(当然这里面是有多表查询的,这不是可执行的sql语法,这里只是为了方便转换思维)=> Illuminate\Database\Eloquent\Collection {#702 all: [ App\Articles {#703 id: 1, title: "title", content: "content", publish_at: "2016-05-14 18:04:44", created_at: "2016-05-14 18:04:48", updated_at: "2016-05-14 18:04:48", user_id: 1, }, App\Articles {#704 id: 2, title: "title2", content: "content2", publish_at: "2016-05-15 04:24:48", created_at: "2016-05-14 18:07:42", updated_at: "2016-05-14 18:07:42", user_id: 1, },
一对多还有一个反向查找的用法,定义个相对的关联
例如一个用户有多篇文章是一对多的关系,然后可以设置通过这篇文章反向查找到这个所属用户
既然是反向查找,那么就是在文章这个model里面做处理
app/Articles.php public function user() { return $this->belongsTo('App\User'); //belongsto就是这个关键字,也是跟意思一样,是属于的意思,文章里面属于User model的文章,返回user //他们的机制依然是通过外键来完成的,通过articles的外键user_id和 user的id 进行关联 }
php artisan tinkerPsy Shell v0.7.2 (PHP 5.5.34 — cli) by Justin Hileman>>> $user = App\Articles::find(1)->user;=> App\User {#696 id: 1, name: "123456", email: "123161769@qq.com", created_at: "2016-05-25 15:31:07", updated_at: "2016-05-25 15:41:53", }>>>
推荐阅读