gpt4 book ai didi

mysql - Yii2 使用左连接将 SqlDataProvider 转换为 ActiveDataProvider

转载 作者:行者123 更新时间:2023-11-28 23:35:08 26 4
gpt4 key购买 nike

我有两个表:电话,电话

两种模式:Call, Phone

和下面的代码:

$q = 'select 
c.calling, sp.name as srcname, sp.org as srcorg,
c.called, dp.name as dstname, dp.org as dstorg
from Calls c
left join Phones sp on c.calling = sp.num
left join Phones dp on c.called = dp.num ORDER BY c.time '
$sql = Yii:$app->db->createCommand($q)
$count = $sql->queryScalar();
$dataProvider = new SqlDataProvider([
'sql' => $q,
'pagination' => [
'pageSize' => 25,
],
'totalCount' => $count,
]);

如何将其转换为 ActiveDataProvider 查询?

$dataProvder = new ActiveDataProvider([
'query' => Call::find()->...,
'pagination' => [
'pageSize' => 25,
],
]);

最佳答案

我有一些意见可以回答您的问题。

模型而不是原始查询

使用Gii为您的两个表创建模型。该扩展是内置的,您可以在 Debug模式下通过调用 http://yourproject.com/gii 简单地打开它。

当您创建模型时,它还会建立您与其他表的关系。您可以根据 model-documentation 轻松自定义这些和 ActiveRecord-documentation Yii2的。后面还会告诉你如何指定关系 here .

在您的情况下,Call-模型将有两个 hasOne-关系:

  • sourcePhone 引用发起调用的手机型号
  • destinationPhone 引用接收电话的型号

用于列出调用的数据提供者和 GridView

启动现在很容易。假设您想列出所有调用,您可以按如下方式进行:

<?= GridView::widget([
'dataProvider'=>new ActiveDataProvider(['query'=>Call::find()]),
'columns'=>[
'id',
[
'label'=>Yii::t('app', 'Source phone'),
'value'=>function ($model, $key, $index, $column) {
return $model->sourcePhone->name;
},
],
[
'label'=>Yii::t('app', 'Destination phone'),
'value'=>function ($model, $key, $index, $column) {
return $model->destinationPhone->name;
},
],
//more columns as of your requirements...
],
]) ?>

您现在不仅使用ActiveDataProvider,您还使用Yii2 的常用方式来显示此类数据(关系等)。可以按照与上述相同的方式在数据提供程序上自定义分页和内容。

如何在 ActiveQuery 中使用 join 部分

这个很简单。一旦您调用关系(延迟加载),表的实际连接就会自动发生。在上面的示例中,这将发生在此处:

return $model->destinationPhone->name

这导致另一个查询填充与相应电话实例的关系。如果您希望这与实际的调用查询一起发生,只需扩展您提供给 ActiveDataProvdier 的查询:

'dataProvider'=>new ActiveDataProvider([
'query'=>Call::find()->joinWith(['sourcePhone', 'destinationPhone']),
]),

joinWith 方法告诉查询获取调用对象以及您在参数中指定的两个关系。请务必阅读 documentation of this method .我也写了一个 answer to a problem I had myself这进一步解释了这一点。

如果您想访问相关对象的列,只需像调用对象的属性一样访问相关对象,然后访问属性本身。在上面的示例中,您可以看到我如何访问相关手机型号的 name 属性。

如果您需要有关某些部分的更多信息,请告诉我。

关于mysql - Yii2 使用左连接将 SqlDataProvider 转换为 ActiveDataProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35981213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com