了解laravel中的hasone()和belongsto()函数

lymnna71  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(634)

我所要做的就是了解我到底应该在什么时候使用 hasOne() 我应该什么时候用 belongsTo() . 我觉得两者都一样。例如,以下是我的模型:

use Illuminate\Database\Eloquent\Model;
use App\Categories;
use App\User;

class tickets extends Model
{
    protected $table = "tickets";

    public function category()
    {
        return $this->hasOne(Categories::class, 'id', 'category_id');
    }

    public function user()
    {
        return $this->hasOne(User::class, 'id', 'user_id');
    }
}

我也可以用 belongsTo() 功能也一样。我应该把它们放进去 user 以及 category 取而代之的是模型。不管怎样,我应该什么时候用 hasOne() 或者 belongsTo() ?

velaa5lx

velaa5lx1#

hasOne 是一对一的关系。 hasMany 是1:n,或一对多关系。
这个 belongsTo 在雄辩的方法是用来定义这些关系的逆。
这些的定义将取决于您的数据模型。
就你而言:
你有一个 Category 模型,哪个
hasMany Ticket s。
你也有一个 User 模型,哪个
hasMany Ticket s。
现在从票证的Angular 来看,你需要定义这2个的倒数 hasMany 关系。您将通过定义 belongsTo .
所以这张票 belongsToUser 以及 belongsToCategory .
回答您的问题:
Ticket 从用户的Angular 看,这是一个1:1的关系,因为票证模型中的外键指向1个用户,类别外键指向1个类别。
但是,由于您创建的关系是1:n(一对多),并且您也在用户和类别模型上定义了它,因此您应该将票据模型中的关系定义为这些关系的逆关系,而hasmany(和hasone)的逆关系是 belongsTo .
在laravel中定义关系时,请记住数据库模式,并以与数据库模式中存在的关系相同的方式定义关系。

hof1towb

hof1towb2#

这些都是相同的,只有一点不同。两者都返回一个具有一个差异的关联对象。当我们将某个关系声明为bellongsto时,意味着存在一个数据库表,该表具有其他表的外键。当我们声明hasone关系时,意味着这个表的主键已经在另一个表中被引用了。将其视为父子表。当我们制作子表时,我们将每个子表引用到其父表,对吗?这是属于你的。当我们制作父表时,我们知道父表中的每个条目在子表中可以有一个或多个条目。那是一种或多种关系。如果你需要更多的澄清,你可以进一步询问。

ssgvzors

ssgvzors3#

无论如何,我应该在什么时候使用hasone()或belongsto()?
把它想象成 hasMany 如果未来可能存在一对多关系。例如:考虑用户和手机型号。关系的本质是用户 hasOne 手机,但如果你想扩展它的功能,以便用户可以有多个电话号码注册用户仍然会有 has* 而电话会保持联系 belongsTo 关系。只需考虑哪一个可以是“父”实体,哪一个应该有 hasOne 方法中的关系。我总是认为用户是父实体,对我来说逻辑上是用户只有一张票。另外,试着坚持雄辩的/laravel/artisan命名约定并命名该模型 Ticket 另一个呢 Category (eloquent和laravel将在需要时解决复数,即表名)。

jk9hmnmh

jk9hmnmh4#

当处理一对多的关系时,你会有一个 hasMany() 和一个 belongsTo() .
我使用的经验法则是,如果一个表有外键(tickets表有外键) user_id fk)那么这个模型 belongsTo 用户。与类别相同。
所以你上面的例子, Ticket belongsTo User & Category .
反过来说, User hasMany Ticket 同样地 Category hasMany Ticket

相关问题