溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ThinkPHP的查詢關(guān)聯(lián)功能怎么用

發(fā)布時(shí)間:2023-04-11 14:15:44 來源:億速云 閱讀:118 作者:iii 欄目:編程語言

本文小編為大家詳細(xì)介紹“ThinkPHP的查詢關(guān)聯(lián)功能怎么用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“ThinkPHP的查詢關(guān)聯(lián)功能怎么用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

一. 模型關(guān)聯(lián)

1.1一對(duì)一關(guān)聯(lián)

一對(duì)一關(guān)聯(lián)即兩個(gè)數(shù)據(jù)表中各自只有一條記錄,這時(shí)使用hasOne()和belongTo()函數(shù)進(jìn)行關(guān)聯(lián)。假設(shè)我們有兩個(gè)表,一個(gè)是user表,一個(gè)是userinfo表,兩張表的結(jié)構(gòu)如下:

user:
id
name

userinfo:
id
user_id
age

上面兩個(gè)表是通過字段user_id進(jìn)行關(guān)聯(lián)的。我們現(xiàn)在要查找user表的用戶信息以及該用戶的年齡,具體操作如下:

在User模型中定義一個(gè)userinfo()方法,方法名隨意。

//User模型

<?php

class User extends Model{
public function userinfo(){
return $this -> hasOne('UserInfo', 'user_id');
}
}

在User模型中定義一個(gè)age()方法,這個(gè)方法其實(shí)是定義了一個(gè)屬性,它訪問userinfo模型的age字段。

//User模型
<?php

class User extends Model{
protected $readonly = ['age'];

public function userinfo(){
return $this -> hasOne('UserInfo', 'user_id');
}

public function getAgeAttr($value, $data){
if(isset($data['userinfo'])){
return $data['userinfo']['age'];
}
return '';
}
}

完成以上代碼后,我們就可以使用find()方法查詢到我們想要的用戶以及其年齡:

//查詢user表中id為1的用戶

$user = User::get(1);
echo $user -> name;
echo $user -> age;

注意:在上面的代碼中,我們使用了$readonly屬性,$readonly屬性是ThinkPHP提供的屬性,他能夠保護(hù)一些屬性不被寫入數(shù)據(jù)庫。在上面的代碼中,我們將age屬性設(shè)定為只讀屬性,這樣當(dāng)$user -> age被訪問的時(shí)候,就會(huì)自動(dòng)調(diào)用getAgeAttr方法去查詢userinfo模型里面的age字段。

1.2 一對(duì)多關(guān)聯(lián)

一對(duì)多關(guān)聯(lián)指的是兩個(gè)數(shù)據(jù)表中一個(gè)有多條記錄,一個(gè)只有一條記錄。如下面的例子:

order:
id
user_id
order_no

order_goods:
id
order_id
name
price

上面兩個(gè)表是通過字段order_id關(guān)聯(lián)的。我們現(xiàn)在要查找user表中用戶的訂單信息以及對(duì)應(yīng)的商品信息,具體操作如下:

在User模型中定義一個(gè)orders()方法,這個(gè)方法表示一個(gè)用戶有多個(gè)訂單。

//User模型

<?php
class User extends Model{
public function orders(){
return $this -> hasMany('Order', 'user_id');
}
}

在Order模型中定義一個(gè)goods()方法,這個(gè)方法表示一個(gè)訂單有多個(gè)商品。

//Order模型
<?php
class Order extends Model{
public function goods(){
return $this -> hasMany('OrderGoods', 'order_id');
}
}

定義好以上的關(guān)聯(lián)后,我們就可以使用find()方法查詢出用戶的訂單以及每個(gè)訂單對(duì)應(yīng)的商品:

//查詢user表中id為1的用戶的訂單信息和訂單的商品信息

$user = User::get(1, 'orders.goods');
var_dump($user -> orders[0] -> goods);

最后一個(gè)參數(shù)('orders.goods')表示同時(shí)查詢它所有的Order和Order關(guān)聯(lián)的Goods信息。

二. 查詢關(guān)聯(lián)

2.1 使用關(guān)聯(lián)查詢

除了在模型層次上定義關(guān)聯(lián)關(guān)系之外,我們還可以通過調(diào)用模型層的關(guān)聯(lián)屬性來實(shí)現(xiàn)關(guān)聯(lián)查詢。如,我們現(xiàn)在想查詢一個(gè)用戶以及它的訂單信息:

$user = User::get(1);
$orders = $user -> orders;
echo $user -> name;
foreach($orders as $order){
echo $order -> order_no . "\n";
}

2.2 延遲關(guān)聯(lián)

如果我們不想在查詢一個(gè)模型的時(shí)候自動(dòng)查詢它的關(guān)聯(lián)關(guān)系,可以使用延遲關(guān)聯(lián)來實(shí)現(xiàn)此需求。如:

$user = User::with('orders')->get(1);

上面的代碼中,我們?cè)O(shè)置$user變量時(shí)在with()函數(shù)中定義了所要獲取的關(guān)聯(lián)關(guān)系,這時(shí)查詢語句不會(huì)默認(rèn)自動(dòng)查詢關(guān)聯(lián)關(guān)系,而是等待我們使用關(guān)聯(lián)關(guān)系時(shí)才會(huì)查詢。

2.3 包含關(guān)聯(lián)

除了上面的延遲關(guān)聯(lián)外,我們還可以通過設(shè)置with方法后的true參數(shù)自動(dòng)包含所有關(guān)聯(lián)關(guān)系來實(shí)現(xiàn)我們的查詢需求。如:

$user = User::with('orders')->find(1, true);

上面的代碼中,我們?cè)趂ind()方法中增加了一個(gè)true參數(shù),這個(gè)參數(shù)表示我們要包含user模型的所有關(guān)聯(lián)關(guān)系。

讀到這里,這篇“ThinkPHP的查詢關(guān)聯(lián)功能怎么用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI