laravel-admin实战做个简单的客户管理——更进一步,使用关联关系处理添加站点

    |     2021年1月1日   |   学习偶记   |     评论已关闭   |    2719

我们用户表建立好以后,开始建立用户所属的站点,一个用户有多个站点,每个站点又有多个关键词需要优化,而关键词又对应多个不同的站点。

所以用户表对于站点来说,是一对多,站点对于关键词来说,是多对多。

在实际应用中,前端的操作应该是添加完用户信息后,接下来需要输入站点,然后点击每个站点,添加关键词。然后每个站点和关键词组成一个项目,会有其在搜索引擎中的排名等等。

而在后台操作中,可能会在用户列表的下拉操作中,有添加站点的菜单。在站点列表的下拉中,有添加关键词的菜单。而关键词,则是一个单独的项目。

1、建立站点表(front_sites)model

php artisan make:model FrontSite

2、建立一对多的关联

文件名:\app\Models\FrontSite.php

namespace App;
use Illuminate\Database\Eloquent\Model;
class FrontSite extends Model
{
//指定表名 因为表名带s
protected $table = 'front_sites';
/**
* 获取该站点的所属用户 一对多(反向)
*/
public function customer()
{
return $this->belongsTo('App\Models\FrontCustomer','front_customers_id');
}
}

文件名:\app\Models\FrontCustomer.php:

增加方法:

/**
* 获取用户的站点 一对多
*/
public function sites()
{
return $this->hasMany('App\Models\FrontSite','id','front_customers_id');
}

3、添加站点为了方便,增加到列表页的操作列。【其实这里只是一个laravel-admin的知识点,实际中我没有使用这个。】

使用laravel-admin的自定义行操作,给列表行增加一个action操作类。官方文档:https://laravel-admin.org/docs/zh/1.x/model-grid-custom-actions

php artisan admin:action FrontCustomer\Addsite –grid-row –name=”增加站点”,下面是代码(路径 app/admin/FrontCustomer/Actions/Addsite)


namespace App\Admin\Actions\FrontCustomer;

use Encore\Admin\Actions\RowAction;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;

class Addsite extends RowAction
{
public $name = '增加站点';

public function handle(Model $model, Request $request)
{
// $model ...

return $this->response()->success('Success message.')->refresh();
}

public function form()
{
$this->textarea('reason', '原因')->rules('required')->value($this->getKey());
}
}

使用:先use App\Admin\Actions\FrontCustomer\Addsite; //添加站点 然后在grid()方法中添加:

$grid->actions(function ($actions) {
$actions->add(new Addsite);
});

新增站点

添加actions后的效果

4、列表显示中,生成一个不存在的数据列,在列添加一个label,点击后添加用户站点。如果用户已经有了站点信息,显示站点信息的个数,点击后显示站点列表,也有一个添加站点的按钮。

grid()方法中的代码【非最终代码,因为需要增加js来跳转到站点添加表单】:

// 添加不存在的字段
$grid->column('site','站点操作')->display(function ($model) {
//因为直接显示$this->sites,金额汇总的chart无法显示,所以采用这种方法。
if($this->sites()->count() == 0)
{
$html = '<small class="label label-warning" style="cursor:pointer;"><i class="fa fa-tv"></i>添加站点</small>';
}
else
{
$html = '<small class="label label-success" data-toggle="modal" data-target="#modal-info" style="cursor:pointer;"><i class="fa fa-tv"></i> '.$this->sites()->count().' website </small>';
}
//网站列表数据
$sites = $this->sites()->get(['id', 'site_name', 'site_logo']);
//生成table,并且添加样式
$table = new Table(['ID', '名称', 'logo'], $sites->toArray(), ['table-bordered','table-sensitive']);
$html .= <<<EOF
<div class="modal modal-info fade" id="modal-info" style="display: none;">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span></button>
<h4 class="modal-title">站点列表</h4>
</div>
<div class="row">
<div class="col-xs-2"></div>
<div class="col-xs-8">
{$table}
</div>
<div class="col-xs-2"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline pull-left" data-dismiss="modal">关闭</button>
<button type="button" class="btn btn-outline">添加站点</button>
</div>

</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
</div>
EOF;

return $html;
});

站点列展示

站点列效果展示

有站点点击弹开模态框

有站点点击弹开模态框

 

噢!评论已关闭。