## å¤æä¸å¯¹å¤å
³è
å¤æå
³èå
许ä¸ä¸ªæ¨¡åå¨å个å
³èå®ä¹æ¹æ³ä¸ä»å±ä¸ä¸ªä»¥ä¸å
¶å®æ¨¡åï¼ä¾å¦ç¨æ·å¯ä»¥è¯è®ºä¹¦åæç« ï¼ä½è¯è®ºè¡¨é常é½æ¯åä¸ä¸ªæ°æ®è¡¨ç设计ãå¤æä¸å¯¹å¤å
³èå
³ç³»ï¼å°±æ¯ä¸ºäºæ»¡è¶³ç±»ä¼¼ç使ç¨åºæ¯è设计ã
ä¸é¢æ¯å
³è表çæ°æ®è¡¨ç»æï¼
~~~
article
id - integer
title - string
content - text
book
id - integer
title - string
comment
id - integer
content - text
commentable_id - integer
commentable_type - string
~~~
æ两个éè¦æ³¨æçå段æ¯Â `comment` 表ä¸ç `commentable_id` å `commentable_type`æ们称ä¹ä¸ºå¤æå段ãå
¶ä¸ï¼Â `commentable_id` ç¨äºåæ¾ä¹¦æè
æç« ç idï¼ä¸»é®ï¼ ï¼è `commentable_type` ç¨äºåæ¾æå±æ¨¡åçç±»åãé常ç设计æ¯å¤æå段æä¸ä¸ªå
Œ
±çåç¼ï¼ä¾å¦è¿éç¨ç`commentable`ï¼ï¼å½ç¶ï¼ä¹æ¯æ设置å®å
¨ä¸åçå段åï¼ä¾å¦ä½¿ç¨`data_id`å`type`ï¼ã
### å¤æå
³èå®ä¹
æ¥çï¼è®©æ们æ¥æ¥çå建è¿ç§å
³èæéç模åå®ä¹ï¼
æç« æ¨¡åï¼
~~~
<?php
namespace app\model;
use think\Model;
class Article extends Model
{
/**
* è·åææé对æç« çè¯è®ºã
*/
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}
~~~
`morphMany`æ¹æ³çåæ°å¦ä¸ï¼
>[info] ### morphMany('å
³è模å','å¤æå段','å¤æç±»å');
**å
³è模å**ï¼å¿
é¡»ï¼ï¼å
³èç模åç±»å
**å¤æå段**ï¼å¯éï¼ï¼æ¯æ两ç§æ¹å¼å®ä¹ å¦ææ¯å符串表示å¤æå段çåç¼ï¼å¤æåæ®µä½¿ç¨ `å¤æåç¼_type`å`å¤æåç¼_id`ï¼å¦ææ¯æ°ç»ï¼è¡¨ç¤ºä½¿ç¨['å¤æç±»åå段å','å¤æIDå段å']ï¼é»è®¤ä¸ºå½åçå
³èæ¹æ³åä½ä¸ºå段åç¼ã
**å¤æç±»å**ï¼å¯éï¼ï¼å½å模å对åºçå¤æç±»åï¼é»è®¤ä¸ºå½å模ååï¼å¯ä»¥ä½¿ç¨æ¨¡ååï¼å¦`Article`ï¼æè
å®æ´çå½å空é´æ¨¡ååï¼å¦`app\index\model\Article`ï¼ã
书ç±æ¨¡åï¼
~~~
<?php
namespace app\model;
use think\Model;
class Book extends Model
{
/**
* è·åææé对书ç±çè¯è®ºã
*/
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}
}
~~~
书ç±æ¨¡åç设置æ¹æ³åæç« æ¨¡åä¸è´ï¼åºå«å¨äºå¤æç±»åä¸åï¼ä½ç±äºå¤æç±»åé»è®¤ä¼åå½å模ååï¼å æ¤ä¸éè¦åç¬è®¾ç½®ã
ä¸é¢æ¯è¯è®ºæ¨¡åçå
³èå®ä¹ï¼
~~~
<?php
namespace app\model;
use think\Model;
class Comment extends Model
{
/**
* è·åè¯è®ºå¯¹åºçå¤æ模åã
*/
public function commentable()
{
return $this->morphTo();
}
}
~~~
`morphTo`æ¹æ³çåæ°å¦ä¸ï¼
>[info] ### morphTo('å¤æå段',['å¤æç±»åå«å']);
**å¤æå段**ï¼å¯éï¼ï¼æ¯æ两ç§æ¹å¼å®ä¹ å¦ææ¯å符串表示å¤æå段çåç¼ï¼å¤æåæ®µä½¿ç¨ `å¤æåç¼_type`å`å¤æåç¼_id`ï¼å¦ææ¯æ°ç»ï¼è¡¨ç¤ºä½¿ç¨['å¤æç±»åå段å','å¤æIDå段å']ï¼é»è®¤ä¸ºå½åçå
³èæ¹æ³åä½ä¸ºå段åç¼
**å¤æç±»åå«å**ï¼å¯éï¼ï¼æ°ç»æ¹å¼å®ä¹
### è·åå¤æå
³è
ä¸æ¦ä½ çæ°æ®è¡¨å模å被å®ä¹ï¼åå¯ä»¥éè¿æ¨¡åæ¥è®¿é®å
³èãä¾å¦ï¼è¥è¦è®¿é®æç¯æç« çææè¯è®ºï¼åå¯ä»¥ç®åç使ç¨Â `comments` å¨æå±æ§ï¼
~~~
$article = Article::find(1);
foreach ($article->comments as $comment) {
dump($comment);
}
~~~
ä½ ä¹å¯ä»¥ä»å¤æ模åçå¤æå
³èä¸ï¼éè¿è®¿é®è°ç¨Â `morphTo` çæ¹æ³å称æ¥è·åæ¥æè
ï¼ä¹å°±æ¯æ¤ä¾åä¸Â `Comment` 模åç `commentable` æ¹æ³ãæ以ï¼æ们å¯ä»¥ä½¿ç¨å¨æå±æ§æ¥è®¿é®è¿ä¸ªæ¹æ³ï¼
~~~
$comment = Comment::find(1);
$commentable = $comment->commentable;
~~~
`Comment` 模åç `commentable` å
³èä¼è¿å `Article` æ `Book` 模åç对象å®ä¾ï¼è¿åå³äºè¯è®ºæå±æ¨¡åçç±»åã
### èªå®ä¹å¤æå
³èçç±»åå段
é»è®¤æ
åµä¸ï¼ThinkPHP ä¼ä½¿ç¨æ¨¡ååä½ä¸ºå¤æ表çç±»ååºåï¼ä¾å¦ï¼`Comment`å±äºÂ `Article` æè
 `Book` , `commentable_type` çé»è®¤å¼å¯ä»¥åå«æ¯Â `Article` æè
 `Book` ãæ们å¯ä»¥éè¿å®ä¹å¤æçæ¶åä¼ å
¥åæ°æ¥å¯¹æ°æ®åºè¿è¡è§£è¦ã
~~~
public function commentable()
{
return $this->morphTo('commentable',[
'book' => 'app\index\model\Book',
'post' => 'app\admin\model\Article',
]);
}
~~~
## å¤æä¸å¯¹ä¸å
³è
å¤æä¸å¯¹ä¸ç¸æ¯å¤æä¸å¯¹å¤å
³èçåºå«æ¯å¨æçä¸å¯¹ä¸å
³èï¼ä¸¾ä¸ªä¾å说æä¸ä¸ªä¸ªäººåå¢é表ï¼èæ 论个人è¿æ¯å¢éé½æä¸ä¸ªå¤´åéè¦ä¿åä½é½ä¼å¯¹åºåä¸ä¸ªå¤´å表
~~~
member
id - integer
name - string
team
id - integer
name - string
avatar
id - integer
avatar - string
imageable_id - integer
imageable_type - string
~~~
ä¼å模åï¼
~~~
<?php
namespace app\model;
use think\Model;
class Member extends Model
{
/**
* è·åç¨æ·ç头å
*/
public function avatar()
{
return $this->morphOne(Avatar::class, 'imageable');
}
}
~~~
å¢é模åï¼
~~~
<?php
namespace app\model;
use think\Model;
class Team extends Model
{
/**
* è·åå¢éç头å
*/
public function avatar()
{
return $this->morphOne(Avatar::class, 'imageable');
}
}
~~~
`morphOne`æ¹æ³çåæ°å¦ä¸ï¼
>[info] ### morphOne('å
³è模å','å¤æå段','å¤æç±»å');
**å
³è模å**ï¼å¿
é¡»ï¼ï¼å
³èç模åç±»åã
**å¤æå段**ï¼å¯éï¼ï¼æ¯æ两ç§æ¹å¼å®ä¹ å¦ææ¯å符串表示å¤æå段çåç¼ï¼å¤æåæ®µä½¿ç¨ `å¤æåç¼_type`å`å¤æåç¼_id`ï¼å¦ææ¯æ°ç»ï¼è¡¨ç¤ºä½¿ç¨['å¤æç±»åå段å','å¤æIDå段å']ï¼é»è®¤ä¸ºå½åçå
³èæ¹æ³åä½ä¸ºå段åç¼ã
**å¤æç±»å**ï¼å¯éï¼ï¼å½å模å对åºçå¤æç±»åï¼é»è®¤ä¸ºå½å模ååï¼å¯ä»¥ä½¿ç¨æ¨¡ååï¼å¦`Member`ï¼æè
å®æ´çå½å空é´æ¨¡ååï¼å¦`app\index\model\Member`ï¼ã
ä¸é¢æ¯å¤´å模åçå
³èå®ä¹ï¼
~~~
<?php
namespace app\model;
use think\Model;
class Avatar extends Model
{
/**
* è·å头å对åºçå¤æ模åã
*/
public function imageable()
{
return $this->morphTo();
}
}
~~~
ç解äºå¤æä¸å¯¹å¤å
³èåï¼å¤æä¸å¯¹ä¸å
³èå
¶å®å°±å¾å®¹æç解äºï¼åºå«å°±æ¯å½å模ååå¨æå
³èç模åä¹é´çå
³èå±äºä¸å¯¹ä¸å
³ç³»ã
- åºè¨
- åºç¡
- å®è£
- å¼åè§è
- ç®å½ç»æ
- é ç½®
- æ¶æ
- 请æ±æµç¨
- æ¶ææ»è§
- å ¥å£æ件
- å¤åºç¨æ¨¡å¼
- URL访é®
- 容å¨åä¾èµæ³¨å ¥
- æå¡
- é¨é¢
- ä¸é´ä»¶
- äºä»¶
- è·¯ç±
- è·¯ç±å®ä¹
- åéè§å
- è·¯ç±å°å
- è·¯ç±åæ°
- è·¯ç±ä¸é´ä»¶
- è·¯ç±åç»
- èµæºè·¯ç±
- 注解路ç±
- è·¯ç±ç»å®
- ååè·¯ç±
- MISSè·¯ç±
- è·¨å请æ±
- URLçæ
- æ§å¶å¨
- æ§å¶å¨å®ä¹
- åºç¡æ§å¶å¨
- 空æ§å¶å¨
- èµæºæ§å¶å¨
- æ§å¶å¨ä¸é´ä»¶
- 请æ±
- 请æ±å¯¹è±¡
- 请æ±ä¿¡æ¯
- è¾å ¥åé
- 请æ±ç±»å
- HTTP头信æ¯
- 伪éæ
- åæ°ç»å®
- 请æ±ç¼å
- ååº
- ååºè¾åº
- ååºåæ°
- éå®å
- æ件ä¸è½½
- æ°æ®åº
- è¿æ¥æ°æ®åº
- åå¸å¼æ°æ®åº
- æ¥è¯¢æé å¨
- æ¥è¯¢æ°æ®
- æ·»å æ°æ®
- æ´æ°æ°æ®
- å é¤æ°æ®
- æ¥è¯¢è¡¨è¾¾å¼
- é¾å¼æä½
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- èåæ¥è¯¢
- å页æ¥è¯¢
- æ¶é´æ¥è¯¢
- é«çº§æ¥è¯¢
- è§å¾æ¥è¯¢
- JSONå段
- åæ¥è¯¢
- åçæ¥è¯¢
- æ¥è¯¢äºä»¶
- è·åå¨
- äºå¡æä½
- åå¨è¿ç¨
- æ°æ®é
- æ°æ®åºé©±å¨
- 模å
- å®ä¹
- 模åå段
- æ°å¢
- æ´æ°
- å é¤
- æ¥è¯¢
- æ¥è¯¢èå´
- JSONå段
- è·åå¨
- ä¿®æ¹å¨
- æç´¢å¨
- æ°æ®é
- èªå¨æ¶é´æ³
- åªè¯»å段
- 软å é¤
- ç±»å转æ¢
- 模åè¾åº
- 模åäºä»¶
- 模åå ³è
- ä¸å¯¹ä¸å ³è
- ä¸å¯¹å¤å ³è
- è¿ç¨ä¸å¯¹å¤
- è¿ç¨ä¸å¯¹ä¸
- å¤å¯¹å¤å ³è
- å¤æå ³è
- å ³èé¢è½½å ¥
- å ³èç»è®¡
- å ³èè¾åº
- è§å¾
- 模æ¿åé
- è§å¾è¿æ»¤
- 模æ¿æ¸²æ
- 模æ¿å¼æ
- è§å¾é©±å¨
- é误åæ¥å¿
- å¼å¸¸å¤ç
- æ¥å¿å¤ç
- è°è¯
- è°è¯æ¨¡å¼
- Traceè°è¯
- SQLè°è¯
- åéè°è¯
- è¿ç¨è°è¯
- éªè¯
- éªè¯å¨
- éªè¯è§å
- é误信æ¯
- éªè¯åºæ¯
- è·¯ç±éªè¯
- å ç½®è§å
- 表å令ç
- 注解éªè¯
- æ项
- ç¼å
- Session
- Cookie
- å¤è¯è¨
- ä¸ä¼
- å½ä»¤è¡
- å¯å¨å ç½®æå¡å¨
- æ¥ççæ¬
- èªå¨çæåºç¨ç®å½
- å建类åºæ件
- æ¸ é¤ç¼åæ件
- çææ°æ®è¡¨å段ç¼å
- çæè·¯ç±æ å°ç¼å
- è¾åºè·¯ç±å®ä¹
- èªå®ä¹æ令
- æ©å±åº
- æ°æ®åºè¿ç§»å·¥å ·
- Workerman
- thinkå©æå·¥å ·åº
- éªè¯ç
- Swoole
- éå½
- å©æå½æ°
- å级æ导
- æ´æ°æ¥å¿