Heim > Artikel > PHP-Framework > Laravel-Einführungs-Tutorial: Die Beziehung zwischen Tabellen
Zunächst einmal über die Beziehung zwischen Tabellen
1. Eins-zu-eins
2. Eins-zu-viele
3 . Viele-zu-viele
Unterscheiden Sie zwischen übergeordneter Tabelle und untergeordneter Tabelle1. „Eins“ ist die übergeordnete Tabelle
2. „Many“ Es handelt sich um eine untergeordnete Tabelle
Wie man mit einer Eins-zu-viele-Beziehung umgehtErstellen Sie ein Feld ( Fremdschlüssel) in der untergeordneten Tabelle, um auf die übergeordnete Tabelle zu verweisen
So gehen Sie mit Viele-zu-Viele-Beziehungen umErstellen Sie ein Zwischenprodukt Tabelle zum Konvertieren von „viele-zu-viele“-Beziehungen in „eins-zu-viele“-Beziehungen
FallanalyseTabelle 1: Benutzertabelle (it_user)
Tabelle 2: Tabelle mit Benutzerdetails (it_user_info)
Tabelle 3: Artikeltabelle (it_article)
Tabelle 4: Ländertabelle (it_country)
Tabelle 5: Benutzerrollentabelle (it_role)
① Eins-zu-eins
Die Benutzertabelle (Tabelle 1) und die Detailtabelle (Tabelle 2) haben eine Eins-zu- eine Beziehung
②Eins-zu-viele
Die Benutzertabelle (Tabelle 1) und die Artikeltabelle (Tabelle 3) sind eine Eins-zu-viele-Beziehung
③Many- zu eins
Die Benutzertabelle (Tabelle 1) und die Ländertabelle (Tabelle 4) sind eine Viele-zu-Eins-Beziehung
④Many-to-many
Die Benutzertabelle (Tabelle 1) und Rollentabelle (Tabelle 5) sind die Viele-zu-Viele-Beziehung
Benutzertabellenerstellung und TestdatenDROP TABLE IF EXISTS `it_user`;
CREATE TABLE `it_user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(64) DEFAULT NULL COMMENT '用户名',
`password` char(32) DEFAULT NULL COMMENT '密码(不使用md5)',
`country_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `国家id` (`country_id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_user
-- ----------------------------
INSERT INTO `it_user` VALUES ('1', 'xiaoming', '123456', '1');
INSERT INTO `it_user` VALUES ('2', 'xiaomei', '123456', '1');
INSERT INTO `it_user` VALUES ('3', 'xiaoli-new', '123', '1');
-- ----------------------------
-- Table structure for it_user_info
-- ----------------------------
DROP TABLE IF EXISTS `it_user_info`;
CREATE TABLE `it_user_info` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`tel` char(11) DEFAULT NULL,
`email` varchar(128) DEFAULT NULL,
`addr` varchar(255) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_user_info
-- ----------------------------
INSERT INTO `it_user_info` VALUES ('1', '13012345678', 'xiaoming@163.com', '北京');
INSERT INTO `it_user_info` VALUES ('2', '15923456789', 'xiaomei@163.com', '上海');
INSERT INTO `it_user_info` VALUES ('3', '18973245670', 'xiaoli@163.com', '武汉');
-- ----------------------------
-- Table structure for it_article
-- ----------------------------
DROP TABLE IF EXISTS `it_article`;
CREATE TABLE `it_article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
`content` text,
`user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_article
-- ----------------------------
INSERT INTO `it_article` VALUES ('1', '世界那么大,我想去看看', '钱包那么小,总是不够', '1');
INSERT INTO `it_article` VALUES ('2', '我想撞角遇到爱', '却是碰到鬼', '2');
INSERT INTO `it_article` VALUES ('3', '哈哈哈哈', '嘻嘻嘻嘻', '1');
-- ----------------------------
-- Table structure for it_country
-- ----------------------------
DROP TABLE IF EXISTS `it_country`;
CREATE TABLE `it_country` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_country
-- ----------------------------
INSERT INTO `it_country` VALUES ('1', '中国');
INSERT INTO `it_country` VALUES ('2', '美国');
-- ----------------------------
-- Table structure for it_role
-- ----------------------------
DROP TABLE IF EXISTS `it_role`;
CREATE TABLE `it_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_role
-- ----------------------------
INSERT INTO `it_role` VALUES ('1', '开发');
INSERT INTO `it_role` VALUES ('2', '测试');
INSERT INTO `it_role` VALUES ('3', '管理');
-- ----------------------------
-- Table structure for it_user_role
-- ----------------------------
DROP TABLE IF EXISTS `it_user_role`;
CREATE TABLE `it_user_role` (
`user_id` int(11) DEFAULT NULL,
`role_id` int(11) DEFAULT NULL,
KEY `role_id` (`role_id`),
KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of it_user_role
-- ----------------------------
INSERT INTO `it_user_role` VALUES ('1', '1');
INSERT INTO `it_user_role` VALUES ('1', '2');
INSERT INTO `it_user_role` VALUES ('1', '3');
INSERT INTO `it_user_role` VALUES ('2', '1');
INSERT INTO `it_user_role` VALUES ('3', '2');
Vorbereitungsarbeiten
1. Routen planenin Routen/ Schreiben Sie die folgende Route unter web.php:
//ORM的关联关系 Route::get('/orm/relation/{mode}','ORM\UserController@relation');2. Schreiben Sie die Beziehungsmethode in App/Http/Controllers/ORM/UserController.php
public function relation($mode)
{
switch ($mode){
case '1_1':
{
//一对一
}
break;
case '1_n':
{
//一对多
}
break;
case 'n_1':
{
//多对一
}
break;
case 'n_n':
{
//多对多
}
break;
default;
}
}
3.1 Verwenden Sie den Composer-Befehl, um
composer require barryvdh/laravel-debugbar
3.2 zu installieren. Ändern Sie die Datei config/app.php, laden Sie debugbar in Laravel in das Projekt und fügen Sie sie dem Array „providers“ hinzu. Die folgende Konfiguration:
Barryvdh\Debugbar\ServiceProvider::class,
Zusätzlich zur Installation des Debugbar-Debugging-Tools können Sie auch die Abfrageüberwachung verwenden: Fügen Sie den folgenden Code zur Boot-Methode von Providers/AppServiceProvider.php hinzu
\DB::listen(function ($query) { var_dump($query->sql); var_dump($query->bindings); echo '<br>'; });
Sie können die ausgeführte SQL auch ausdrucken Stellungnahme.
Eins-zu-eins
1 Erstellen Sie das Userinfo-ModellobjektGeben Sie das ein cmd-Befehlszeile. Wenn Sie den folgenden Befehl in dem Verzeichnis ausführen, in dem sich das Laravel-Projekt befindet:
php artisan make:model Userinfo
, wird Userinfo.php im App-Verzeichnis generiert
2. Bearbeiten Sie die Userinfo-Modelldatei<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Userinfo extends Model
{
protected $table = 'user_info';
protected $primaryKey = 'user_id';
protected $fillable = ['user_id','tel','email','addr'];
public $timestamps = false;
}
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class UserModel extends Model
{
protected $table = 'user';//真是表名
protected $primaryKey = 'id';//主键字段,默认为id
protected $fillable = ['name','password'];//可以操作的字段
public $timestamps = false;//如果数据表中没有created_at和updated_id字段,则$timestamps则可以不设置,
默认为true
public function Userinfo()
{
/*
* @param [string] [name] [需要关联的模型类名]
* @param [string] [foreign] [参数一指定数据表中的字段]
* */
return $this->hasOne('App\Userinfo','user_id');
}
public function relation($mode) { switch ($mode){ case '1_1': { //一对一 $data = UserModel::find(1)->Userinfo()->get(); dd($data); } break; default; } }Eins-zu-viele
1. Erstellen Sie das Artikelmodellobjekt
Führen Sie den Befehl
php artisan make:model Articleaus, um die Article.php-Datei unter der App zu generieren
2. Schreiben Sie die Artikelmodelldatei
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Article extends Model { protected $table = 'article'; protected $primaryKey = 'id'; protected $fillable = ['id','title','content','user_id']; public $timestamps = false; }3 . Schreiben Sie UserModel und fügen Sie die Eins-zu-viele-Methode
public function Artice() { return $this->hasMany('App\Article','User_id'); }4 hinzu. Schreiben Sie den UserController und rufen Sie die Eins-zu-viele-Methode
public function relation($mode) { switch ($mode){ case '1_1': { //一对一 $data = UserModel::find(1)->Userinfo()->get(); dd($data); } break; case '1_n': { //一对多 $data = UserModel::find(1)->Artice()->get(); dd($data); } break; default; } } }viele-zu-eins
1. Erstellen Sie das Ländermodellobjekt
führt den Befehl php artisan make:model Country
aus
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Country extends Model { protected $table = 'country'; //真实表名 protected $primaryKey = "id"; //主键id protected $fillable = ['id','name']; //允许操作的字段 public $timestamps = false; //如果数据表中没有created_at和updated_id字段,则$timestamps则可以不设置, 默认为true }
3. UserModel schreiben und Viele-zu-Eins-Methode hinzufügen
public function Country() { return $this->belongsTo('App\Country','country_id'); }
4 UserController und Aufrufmethode
public function relation($mode) { switch ($mode){ case '1_1': { //一对一 $data = UserModel::find(1)->Userinfo()->get(); dd($data); } break; case '1_n': { //一对多 $data = UserModel::find(1)->Artice()->get(); dd($data); } break; case 'n_1': { //多对一 $data = UserModel::find(1)->Country()->get(); dd($data); } break; default; } } }
Many-to-Many
1. Rollenmodellobjekt erstellen
Befehl ausführenphp artisan make:model Role
Befehl ausführen
php artisan make:model User_role2. Rollenmodell schreiben
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Role extends Model { protected $table = 'role'; protected $primaryKey = "id"; protected $fillable = ['name']; public $timestamps =false; }
Benutzer_Rollenmodell schreibenDa es in der Tabelle kein Primärschlüsselfeld gibt, werden zwei Felder benötigt
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User_role extends Model { protected $table = 'user_role'; public $timestamps =false; }3. Schreiben Sie das UserModel und fügen Sie die Viele-zu-viele-Methode hinzu
public function Role(){ /* * 第一个参数:要关联的表对应的类 * 第二个参数:中间表的表名 * 第三个参数:当前表跟中间表对应的外键 * 第四个参数:要关联的表跟中间表对应的外键 * */ return $this->belongsToMany('App\Role','user_role','user_id','role_id'); }
4. Schreiben Sie UserController und rufen Sie die Many-to-Many-Methode auf
public function relation($mode) { switch ($mode){ case '1_1': { //一对一 $data = UserModel::find(1)->Userinfo()->get(); dd($data); } break; case '1_n': { //一对多 $data = UserModel::find(1)->Artice()->get(); dd($data); } break; case 'n_1': { //多对一 $data = UserModel::find(1)->Country()->get(); dd($data); } break; case 'n_n': { //多对多 $data = UserModel::find(2)->Role()->get(); dd($data); } break; default; } }
Zusammenfassung:
1. So verwenden Sie eins: hasOne ()2. So verwenden Sie eins-zu-viele: hasMany()
3. So verwenden Sie viele-zu-eins: gehörtzu()
4. Viele So verwenden Sie viele: gehörtToMany()
PHP-chinesische Website, eine große Anzahl kostenloser
Laravel-Einführungs-Tutorials, willkommen zum Online-Lernen!
Dieser Artikel wurde reproduziert von: https://blog.csdn.net/weixin_38112233/article/details/79220535
Das obige ist der detaillierte Inhalt vonLaravel-Einführungs-Tutorial: Die Beziehung zwischen Tabellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!