drodata
- drodata 回答了问题 yii2 rest 怎么指定多级表关联关系
官方 issues 里有一个相关的讨论:https://github.com/yiisoft/yii2/issues/8061 但该特性还未实现。
如果表格结构复杂,通过自定义 fields() 来获取关联表的数据算不算一种办法呢?
// 班级模型 public function fields() { return [ 'id', 'name', // 获取所有学生 'students' => function ($model) { return $model->students; }, // 获取所属学校 'school' => function ($model) { return $model->school; }, ]; }
把 console 测试代码放在事务内再测试一下。
- drodata 回答了问题 扩展gii时遇到一个小问题。
我想你使用 Gii 的方法存在问题。如果你要自定义 Gii, 不要在
vendor/yiisoft/yii2-gii
内直接修改,而是参照官方的建议去做,具体参考一下 YiiChina 上这个贴子:大家在实际开发中经常用Gii生产代码吗?如果用了一些后台模板,那生产的代码样式怎么处理?从你描述看,你是想针对某些特定的动作使用特定的 layout, 这个需求还没到使用 Gii 的地步。手动在对应的动作方法内声明一下即可:
public function actionIndex() { $this->layout = 'xxx'; // ... }
如果你想让控制器下所有动作都使用该自定义 layout, 设置如下:
class OrderController extends Controller { public $layout = 'xxx'; }
你先看一下 Creating your own templates。
刚开始你可以把模板放在项目内,根据自己的需要做些改动体会一下。
- drodata 赞了回答
首先 先从yii文档入手 如果觉得文档的80% 你都懂 都知道怎么用 并有一定的自己的想法 那就不妨带着自己的想法 从你觉得可以有想法的那个方法 类 还是什么开始 去解读它 那么恭喜你 就在分析他的源码了
- drodata 回答了问题 Yii2符合表单模型的疑问求解惑
“新建表单模型”的思路没问题。假设:
表单模型为
PostForm
, 内容大致如下:class PostForm extends \yii\base\Model { // 存储 Post 模型中的字段 public $title; // 存储 PostExtra 模型中的字段 public $content; // 存储 PostAttachment 模型中的字段 public $imgUrl; public function rules() { // ... } }
一个 Post 对应一个 PostExtra;
- 一个 Post 对应一个 PostAttachment;
帖子修改操作的控制器代码大致如下:
class PostController extends \yii\web\Controller { public function actionUpdate($id) { $post = Post::findOne($id); $extra = $post->extra; $attachment = $post->attachment; $postForm = new PostForm(); $postForm->title = $post->title; $postForm->content = $extra->content; $postForm->imgUrl = $attachment->imgUrl; if ($postForm->load(Yii::$app->request->post()) && $postForm->validate()) { // 写入修改后的数据 } return $this->render('update', ['postForm' => $postForm]); } }
“多模型同时输入”也可以。你觉得“别扭”的三个 &&:
load() && load()
validate() && validate()
save() && save()
前两个是必须的,最后一个可以放在一个事务内。过程大致如下:
class PostController extends \yii\web\Controller { public function actionUpdate($id) { $post = Post::findOne($id); $extra = $post->extra; $attachment = $post->attachment; if ( $post->load(Yii::$app->request->post()) && $post->validate() && $extra->load(Yii::$app->request->post()) && $extra->validate() && $attachment->load(Yii::$app->request->post()) && $attachment->validate() ) { $transaction = Yii::$app->db->beginTransaction(); try { if (!$post->save(false)) { throw new \yii\db\Exception('Failed to insert xxx.'); } if (!$extra->save(false)) { throw new \yii\db\Exception('Failed to insert xxx.'); } if (!$attachment->save(false)) { throw new \yii\db\Exception('Failed to insert xxx.'); } $transaction->commit(); return $this->redirect('index'); } catch(\Exception $e) { $transaction->rollBack(); throw $e; } } return $this->render('update', [ 'post' => $post, 'extra' => $extra, 'attachment' => $attachment, ]); } }