如何使用 hasOne 和 onCondition 创建关系查询?
How to create a relation query with hasOne and onCondition?
因为我有一个索引 (user_id,lesson_id
),所以我想使用该索引进行查询。
在图像的情况下它不使用索引,对吗?
注意:USER_ID它是一个整数值,而不是一个字段。
//the following SQL it is my expecting:
//not generate by php code. just show a example for what to do.
LEFT JOIN `user_lesson_order` ON (
//user_id is current logined
`user_lesson_order` . `user_id` = 29
)
AND (
`lesson_favorite` . `lesson_id` = `user_lesson_order` . `lesson_id`
)
AND ...
AND ...
//the wrong php code. it will generate a wrong sql;
public function getLessonOrder() {
return $this->hasOne(UserLessonOrder::class, [
UserLessonOrder::tableName() . '.user_id' => $this->user_id,
'lesson_id' => 'lesson_id'
])->onCondition([
UserLessonOrder::tableName() . '.payment_status' =>SystemCode::COMMON_PAYMENT_STATUS_YES,
UserLessonOrder::tableName() . '.status' => SystemCode::COMMON_STATUS_ENABLE
]);
}
//the wrong sql:
LEFT JOIN `user_lesson_order` ON (
//user_lesson_order.user_id = 41, this is my expect sql.
`lesson_favorite`.`41` = `user_lesson_order`.`user_id`
AND `lesson_favorite`.`lesson_id` = `user_lesson_order`.`lesson_id`
) AND (
(
`user_lesson_order`.`payment_status` = 'COMMON_PAYMENT_STATUS_YES'
) AND (
`user_lesson_order`.`status` = 'COMMON_STATUS_ENABLE'
)
)
Unknown column 'lesson_favorite.41' in 'on clause'
fllow php 代码将生成正确的 sql。但它不能使用 unique_key(user_id,lesson_id)
;
//follow code is working. but genarate a sql cant not use unique_key(user_id,lesson_id);
public function getLessonOrder() {
return $this->hasOne(UserLessonOrder::class, [
'lesson_id' => 'lesson_id'
])->onCondition([
UserLessonOrder::tableName() . '.user_id' => $this->user_id,
UserLessonOrder::tableName() . '.payment_status' =>SystemCode::COMMON_PAYMENT_STATUS_YES,
UserLessonOrder::tableName() . '.status' => SystemCode::COMMON_STATUS_ENABLE
]);
}
//sql generate by php code,it is working. but cant use unique_index(user_id,lesson_id);
LEFT JOIN `user_lesson_order` ON (
`lesson_favorite` . `lesson_id` = `user_lesson_order` . `lesson_id`
) AND (
//user_id is current logined
`user_lesson_order` . `user_id` = 29
)
AND ...
AND ...
请告诉我:
1, 哪种情况会使用数据库的索引unique_key (user_id,lesson_id)
;
2、如何创建这样的查询?第一个 user_id,然后 lesson_id。
//user_id is current logined
left join user_lesson_order on user_lesson_order.user_id = 29
and lesson_favorite.lesson_id = user_lesson_order.lesson_id
您可以使用多个字段来定义关系链接
$this->hasOne(
UserLessonOrder::class,
['lesson_id' => 'lesson', 'user_id' => 'user_id']
)
->onCondition([
'payment_status' => ...
'status' => ...
])
在大多数情况下,在关系定义中使用任何模型属性 ($this->user_id
) 都会导致问题
public function getLessenOrder() {
return $this->hasOne(UserLessonOrder::class, [
// 'user_id' => 'user_id', // is it part of the relation?
'lesson_id' => 'lesson_id',
])->onCondition([
UserLessonOrder::tableName() . '.payment_status' => SystemCode::COMMON_PAYMENT_STATUS_YES,
UserLessonOrder::tableName() . '.status' => SystemCode::COMMON_PAYMENT_ENABLE,
UserLessonOrder::tableName() . '.user_id' => $this->user_id,
])
}
这应该可以做到。创建的 JOIN 应该使用索引。不是吗?您可以查看 runtime/logs/app.log
以了解生成了哪个查询。
如果可行,唯一的区别是在 hasOne()
的 $link
参数中使用正确的字段名称:session_id
而不是 session
。使用此参数,您只需说明哪些字段(列)应该相关 - 此处不可能使用值。这可以在 onCondition()
中完成,您已经完成了。
因为我有一个索引 (user_id,lesson_id
),所以我想使用该索引进行查询。
在图像的情况下它不使用索引,对吗?
注意:USER_ID它是一个整数值,而不是一个字段。
//the following SQL it is my expecting:
//not generate by php code. just show a example for what to do.
LEFT JOIN `user_lesson_order` ON (
//user_id is current logined
`user_lesson_order` . `user_id` = 29
)
AND (
`lesson_favorite` . `lesson_id` = `user_lesson_order` . `lesson_id`
)
AND ...
AND ...
//the wrong php code. it will generate a wrong sql;
public function getLessonOrder() {
return $this->hasOne(UserLessonOrder::class, [
UserLessonOrder::tableName() . '.user_id' => $this->user_id,
'lesson_id' => 'lesson_id'
])->onCondition([
UserLessonOrder::tableName() . '.payment_status' =>SystemCode::COMMON_PAYMENT_STATUS_YES,
UserLessonOrder::tableName() . '.status' => SystemCode::COMMON_STATUS_ENABLE
]);
}
//the wrong sql:
LEFT JOIN `user_lesson_order` ON (
//user_lesson_order.user_id = 41, this is my expect sql.
`lesson_favorite`.`41` = `user_lesson_order`.`user_id`
AND `lesson_favorite`.`lesson_id` = `user_lesson_order`.`lesson_id`
) AND (
(
`user_lesson_order`.`payment_status` = 'COMMON_PAYMENT_STATUS_YES'
) AND (
`user_lesson_order`.`status` = 'COMMON_STATUS_ENABLE'
)
)
Unknown column 'lesson_favorite.41' in 'on clause'
fllow php 代码将生成正确的 sql。但它不能使用 unique_key(user_id,lesson_id)
;
//follow code is working. but genarate a sql cant not use unique_key(user_id,lesson_id);
public function getLessonOrder() {
return $this->hasOne(UserLessonOrder::class, [
'lesson_id' => 'lesson_id'
])->onCondition([
UserLessonOrder::tableName() . '.user_id' => $this->user_id,
UserLessonOrder::tableName() . '.payment_status' =>SystemCode::COMMON_PAYMENT_STATUS_YES,
UserLessonOrder::tableName() . '.status' => SystemCode::COMMON_STATUS_ENABLE
]);
}
//sql generate by php code,it is working. but cant use unique_index(user_id,lesson_id);
LEFT JOIN `user_lesson_order` ON (
`lesson_favorite` . `lesson_id` = `user_lesson_order` . `lesson_id`
) AND (
//user_id is current logined
`user_lesson_order` . `user_id` = 29
)
AND ...
AND ...
请告诉我:
1, 哪种情况会使用数据库的索引unique_key (user_id,lesson_id)
;
2、如何创建这样的查询?第一个 user_id,然后 lesson_id。
//user_id is current logined
left join user_lesson_order on user_lesson_order.user_id = 29
and lesson_favorite.lesson_id = user_lesson_order.lesson_id
您可以使用多个字段来定义关系链接
$this->hasOne(
UserLessonOrder::class,
['lesson_id' => 'lesson', 'user_id' => 'user_id']
)
->onCondition([
'payment_status' => ...
'status' => ...
])
在大多数情况下,在关系定义中使用任何模型属性 ($this->user_id
) 都会导致问题
public function getLessenOrder() {
return $this->hasOne(UserLessonOrder::class, [
// 'user_id' => 'user_id', // is it part of the relation?
'lesson_id' => 'lesson_id',
])->onCondition([
UserLessonOrder::tableName() . '.payment_status' => SystemCode::COMMON_PAYMENT_STATUS_YES,
UserLessonOrder::tableName() . '.status' => SystemCode::COMMON_PAYMENT_ENABLE,
UserLessonOrder::tableName() . '.user_id' => $this->user_id,
])
}
这应该可以做到。创建的 JOIN 应该使用索引。不是吗?您可以查看 runtime/logs/app.log
以了解生成了哪个查询。
如果可行,唯一的区别是在 hasOne()
的 $link
参数中使用正确的字段名称:session_id
而不是 session
。使用此参数,您只需说明哪些字段(列)应该相关 - 此处不可能使用值。这可以在 onCondition()
中完成,您已经完成了。