多表join和with组合使用生成sql错误
easyswooleæ¡æ¶çæ¬å·ãormç»ä»¶çæ¬å· [Version]
easyswooleçæ¬ï¼3.4.1 "easyswoole/orm": "^1.4"
é®é¢æè¿°åæªå¾ [Question]
使ç¨å¤ä¸ªjoinåwithçæ åµï¼çæçsqlé误
SELECT SQL_CALC_FOUND_ROWS *,
FROM
fa_test_order AS orders
JOIN fa_test_order_goods AS order_goods ON order_goods.order_id = orders.id
JOIN fa_test_order_group AS order_group ON order_group.order_id = orders.id
JOIN fa_test_order_log AS order_log ON order_log.order_id = orders.id
LIMIT 0,20
å¤çæäºä¸ä¸ªéå·
ææ¥æ åµåæå°å¤ç°èæ¬ [Tests and Recurrence]
代ç ï¼ $orderModel = new TestOrder(); $orderModel->alias("orders"); $with[] = ["orderLog", "orderGoods"]; $orderModel->with($with); $orderModel->join("fa_test_order_goods as order_goods", "order_goods.order_id = orders.id"); $orderModel->join("fa_test_order_group as order_group", "order_group.order_id = orders.id"); $orderModel->join("fa_test_order_log as order_log", "order_log.order_id = orders.id");
$pagenaition = [1, 20];
$field = "*";
$order = null;
$where = [];
$data = $orderModel->field($field)
->getOrderBy($order)
->withTotalCount()
->page(intval($pagenaition[0]), $pagenaition[1])
->all($where);
return $this->send(1, "è·åæå", $data);
模å代ç ï¼
namespace App\Model; class TestOrder extends AbstractModel { protected $tableName = "fa_test_order";
public function orderLog()
{
return $this->hasOne(TestOrderLog::class, function (QueryBuilder $query) {
}, "order_id", "id");
}
public function orderGoods()
{
return $this->hasOne(TestOrderGoods::class, function (QueryBuilder $query) {
}, "order_id", "id");
}
}
æ°æ®åºï¼
1ãæ°æ®åº1
CREATE TABLE fa_test_order_goods (
order_id int(11) NOT NULL COMMENT '订åid',
goods_id int(11) NOT NULL COMMENT 'ååid',
name varchar(255) NOT NULL DEFAULT '' COMMENT 'åååç§°',
num int(11) DEFAULT NULL COMMENT 'æ°é'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO fa_test_order_goods VALUES (1, 1, 'æµè¯11', 1);
INSERT INTO fa_test_order_goods VALUES (2, 1, 'æµè¯11', 1);
INSERT INTO fa_test_order_goods VALUES (3, 1, 'æµè¯11', 1);
INSERT INTO fa_test_order_goods VALUES (4, 1, 'æµè¯11', 1);
2ãæ°æ®åº2
CREATE TABLE fa_test_order_group (
order_id int(11) NOT NULL COMMENT '订åid',
is_join tinyint(1) NOT NULL COMMENT 'æ¯å¦å å
¥ï¼1:æ¯ï¼0:å¦',
join_time int(11) NOT NULL COMMENT 'å å
¥æ¶é´'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO fa_test_order_group VALUES (1, 1, 1610434018);
INSERT INTO fa_test_order_group VALUES (2, 1, 1610434062);
INSERT INTO fa_test_order_group VALUES (3, 1, 1610434073);
INSERT INTO fa_test_order_group VALUES (4, 1, 1610434684);
3ãæ°æ®åº3
CREATE TABLE fa_test_order_log (
order_id int(11) NOT NULL COMMENT '订åid',
title varchar(255) NOT NULL COMMENT 'åç§°',
content varchar(255) NOT NULL COMMENT 'å
容'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO fa_test_order_log VALUES (4, 'æµè¯æ é¢1', 'æµè¯å
容11');
4ãæ°æ®åº4
CREATE TABLE fa_test_order (
id int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
order_no varchar(100) NOT NULL COMMENT '订åå·',
create_time int(11) NOT NULL,
update_time int(11) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
INSERT INTO fa_test_order VALUES (1, '111111', 1610434018, 1610434018);
INSERT INTO fa_test_order VALUES (2, '111111', 1610434062, 1610434062);
INSERT INTO fa_test_order VALUES (3, '111111', 1610434073, 1610434073);
INSERT INTO fa_test_order VALUES (4, '111111', 1610434684, 1610434684);
因为你的代码编写不正确,造成一系列问题,按以下去编写:
class TestOrderLog extends \EasySwoole\ORM\AbstractModel{
protected $tableName = 'fa_test_order_log';
}
class TestOrderGoods extends \EasySwoole\ORM\AbstractModel{
protected $tableName = 'fa_test_order_goods';
}
class TestOrder extends \EasySwoole\ORM\AbstractModel
{
protected $tableName = "fa_test_order";
public function orderLog()
{
return $this->hasOne(TestOrderLog::class, function (QueryBuilder $query) {
}, "id","order_id");
}
public function orderGoods()
{
return $this->hasOne(TestOrderGoods::class, function (QueryBuilder $query) {
}, "id","order_id");
}
}
$orderModel = new TestOrder();
$orderModel->alias("orders");
$orderModel->with(["orderLog", "orderGoods"]);
$orderModel->join("fa_test_order_goods as order_goods", "order_goods.order_id = orders.id");
$orderModel->join("fa_test_order_group as order_group", "order_group.order_id = orders.id");
$orderModel->join("fa_test_order_log as order_log", "order_log.order_id = orders.id");
$pagenaition = [1, 20];
$field = "*";
$order = null;
$where = [];
$data = $orderModel->field($field)
->withTotalCount()
->page(intval($pagenaition[0]), $pagenaition[1])
->all($where);
var_dump($orderModel->lastQuery()->getLastQuery());