laravel 中的 Eloquent ORM 里,hasOne 和 belongsTo 有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel 中的 Eloquent ORM 里,hasOne 和 belongsTo 有啥区别相关的知识,希望对你有一定的参考价值。

没什么大区别,在处理代码的时候是没有区别的,唯一的区别就是逻辑上的合理性。
打个比方,一个人有一部手机,在人也就是用户model 中,你肯定要用hasOne 而不是belongsTo,因为你不能说人是属于手机(虽然也可以这样,但不符合常理,会让人觉得莫名其妙);在手机model中使用belongsTo,意味着手机是物件,人是主体,也就是手机是人类的附属品,且只能有一个。使用的方法名也要切合实际,这样读代码自己或别人才能看明白。

在使用时,其结果都是返回当前用户的手机或是手机的用户(你可以选择collection类型也可以选择array类型)。注意。在写方法名的时候,最好使用单数(例如phone或者user)而不是复数(因为手机和人相对的都是单个的,应该用单数,这样的命名才更符合逻辑与事实)。
参考技术A

  举例来说,一个 User model 会有一个 Bed Model。我们可以在 Eloquent 定义这些关系。

#定义一个 1对1关系

<?php

class User extends Eloquent 

    public function bed()
    
        return $this->hasOne('Bed');
    

  传入 hasOne()方法的第一个参数是关连 model 的名称。一旦关连被建立,我们便可以使用 Eloquent 的动态属性取得关连 model。

<?php

$bed = User::find(1)->bed;

  实际执行的SQL语句如下:

SELECT * FROM users WHERE id = 1

SELECT * FROM beds WHERE user_id = 1

  这边要留意的是,Eloquent 会假定关连的外键是基於 model 的名称,以这个例子来说,Bed model 会假设 user_id为外键。

  belongs_to 会在宣告的model中建立外键,而has_one会将外键放在另外关连的Modle中。

#定义反向关连

使用 belongsTo()方法去定义 Bed model 的反向关连:

<?php

class Bed extends Eloquent 

    public function user()
    
        return $this->belongsTo('User');
    

在上面这个例子中,Eloquent 会根据 bed table 里的 user_id 栏位当做外键。如果您想要自行定义不同的栏位当外键,可以在 belongsTo()方法传入第二个参数:

<?php

class Phone extends Eloquent 

    public function user()
    
        return $this->belongsTo('User', 'local_key');
    

总结:想要在宣告的model中要有外键用belongs_to ,让这个model要去参照别人,如果想外键在别的model,让别人来参照这个model,则使用 has_one。

Laravel 数据库操作之Eloquent ORM模型

//模型中的相关代码
namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model{
//默认对应的是模型复数,即students,如果不是,需要自己指定表名
protected $table = ‘student‘;//指定表名

//默认主键是id,如果不是,需要指定
protected $primaryKey = ‘id‘;

//自动维护时间戳
public $timestamps = true;

protected function getDateFormat()
{
return time();
}

//不格式化时间戳
protected function asDateTime($val)
{
return $val;
}

//指定允许批量赋值的字段
protected $fillable = [‘name‘,‘age‘];

//指定不允许批量赋值的字段
protected $guarded = [‘name‘,‘age‘];

}


//控制器的相关代码
//orm 使用模型查询

public function orm1(){

//all().返回模型的对象
$student = Student::all();

//find()
$student = Student::find(100);

//findOrFail(),查找不到就报错
$student = Student::findOrFail(100);

//get()
$student = Student::get();

//first()
$student = Student::where(‘id‘,‘>‘,10)
->orderBy(‘age‘,‘desc‘)
->first();
}


//orm 使用模型查询
public function orm2(){
//使用模型新增数据
$student = new Student();
$student->name = ‘hello‘;
$student->age = ‘hello‘;
$bool = $student->save();
var_dump($bool);

//格式化日期
$student = Student::find(1);
echo date(‘Y-m-d H:i:s‘,$student->addtime);

//使用模型的create方法新增数据,
$student = Student::create([‘name‘=>‘haha‘,‘age‘=>10]);

//firstOrCreate,先查找,若没有则新增
$student = Student::firstOrCreate([‘name‘=>‘haha‘]);

//firstOrNew,先查找,若没有则返回实例,需要自行调用save新增
$student = Student::firstOrNew([‘name‘=>‘haha‘]);
$bool = $student->save();

//通过模型更新数据
$student = Student::find(10);
$student->name = ‘happy‘;
$bool = $student->save();
var_dump($bool);

//批量更新,返回行数
$num = Student::where(‘id‘,‘>‘,10)->update(
[‘age‘=>20]
);
var_dump($num);

//通过模型删除,不存在会报错
$student = Student::find(10);
$bool = $student->delete();
var_dump($bool);

//通过主键删除
$num=Student::destroy(10);
var_dump($num);
$num=Student::destroy([10,11,20]);
var_dump($num);

$num=Student::where(‘id‘,‘>‘,20)->delete();
var_dump($num);

}














































































































以上是关于laravel 中的 Eloquent ORM 里,hasOne 和 belongsTo 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Laravel系列4.3模型Eloquent ORM的使用

如何根据 laravel eloquent orm 中的两列进行查询

Laravel Eloquent ORM 事务

Laravel Eloquent ORM 中的 join()->where()

Laravel 数据库操作之Eloquent ORM模型

如何在 Eloquent ORM laravel 中获取最后一个插入 ID