我正在创建一个网站,让用户可以列出最多5家与之关联的公司。当其他用户搜索这些公司时,与该公司关联的所有用户都将显示在搜索结果中。
公司将由用户通过文本输入字段提交。
如何避免用户提交重复的公司?例如。如果UserA提交了一个名为stackoverflow的公司,那么UserB就会提交stackoverflow,我的数据库中会有2个stackoverflow。
我有3张桌子:
用户表
ID |用户名|电子邮件
公司表
id |公司名称
UsersCompany表
ID |用户ID | companyID
我正在使用Laravel 5
答案 0 :(得分:4)
您应该使用Laravel Validation和关键字unique
来处理此问题:
$this->validate($request, [
'company' => 'required|unique:company|max:255'
]);
此外,您可以使用自定义Request类来处理form validation:
public function rules()
{
return [
'company' => 'required|unique|max:255'
];
}
如果我是你,我会使用第二个。
答案 1 :(得分:4)
您可以通过简单的检查来完成。如果公司不存在,请创建新公司或将公司附加给用户。
我假设公司是用逗号分隔的单个文本输入提交的,并且您已正确设置关系。如果没有,请检查this。
示例:
// Inside your controller
public function post_something(Request $request)
{
// Always good to validate
$this->validate(....);
// Somehow get your user model
$user = ....
// Get companies input and loop
$company_names = $request->input('company_names');
$company_names = explode(',', $company_names );
foreach ($company_names as $company_name)
{
$company = Company::firstOrCreate(['company_name' => $company_name]);
$user->companies()->attach($company);
}
// Your other stuff
//
....
}
答案 2 :(得分:3)
这可以通过以下方式实现 在company_Name上创建PRIMARY Key或UNIQUE
ALTER TABLE company_Table ADD PRIMARY KEY(company_Name)
ALTER TABLE company_Table ADD UNIQUE (company_Name)
或
IF NOT EXISTS(QUERY) Then INSERT
或
创建BEFORE INSERT触发器。
http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html
答案 3 :(得分:2)
您可以在表格上添加唯一索引。因此,如果您的列名为company_name
且表格为companies
,则可以执行以下操作:
alter table companies add unique (company_name)
或者,您可以在允许插入之前在编程中执行查询,该插入检查条目是否已存在。或者两者兼而有之。
答案 4 :(得分:2)
答案 5 :(得分:2)
通过在MySQL中使用UNIQUE
,这很容易获得。
ALTER TABLE `company_Table` ADD UNIQUE (
`company_Name`
)
通过将其放入MySQL,company_Name列变为UNIQUE
,这意味着只能有一个。如果您尝试插入另一个,则会返回错误。
UNIQUE
也可用于用户群上的成员电子邮件。 UNIQUE
也非常适合POST_ID,MEMBER_ID,COMMENT_ID和其他几个,可能会在博客,论坛或社交媒体网站上变得非常有用。
如果您想在创建此表时创建UNIQUE
密钥,请按以下步骤操作:
CREATE TABLE Company_Table
(
ID int NOT NULL,
Company_Name varchar(255),
UNIQUE (Company_Name)
)
W3schools有一个很好的教程:Here
答案 6 :(得分:2)
我认为你应该使用Eloquent firstOrCreate
方法
如果您将使用这种方法,那么您甚至不需要在公司下进行任何“独特”验证。
数据库架构
users
id
username
companies
id
company_name
user_company
id
user_id
company_id
模型(仅关系方法)
user.php的public function companies()
{
return $this->belongsToMany('NAMESPACE_TO_YOUR_MODEL\Company');
/*you can set foreign keys fields if it's not canonical see docs*/
}
Company.php
public function users()
{
return $this->belongsToMany('NAMESPACE_TO_YOUR_MODEL\User');
}
<强>控制器强>
public function store(CompanyRequest $request)
{
$companiesFromRequest = $request->get('companies');
// it's just for example, you can retreive companies from request with any other approach
$companiesId = [];
foreach ($companiesFromRequest as $company) {
// assumes that $company variable contains all or at least part of info,
// that need to create or identify particuliar comapny
$c = Company::firstOrCreate($company);
$companiesId[] = $c->id;
}
// in this case we just retreive existing user
$user = User::findOrFail($request->get('user_id'));
$user->companies()->sync($companiesId);
// or you can use
// $user->companies()->attach($companiesId);
// difference between this commands you can found in official laravel docs
return redirect('any/place/you/wish')
}
答案 7 :(得分:1)
应用层: 使用Laravel的Validation属性“unique”来确定只允许使用唯一的公司名称。
public function store(Request $request)
{
$this->validate($request, [
'company_name' => 'required|unique:companies|max:255',
]);
// The company name is valid, store in database...
}
数据库层: 添加一个约束作为company_name列的公司表的迁移唯一。
$table->string('company_name')->unique();
答案 8 :(得分:1)
在larval中找到答案我只使用firstOrNew()创建方法 将尝试在匹配给定属性的数据库中查找记录。但是,如果未找到模型,则将返回新的模型实例。请注意,firstOrNew返回的模型尚未保留到数据库中。您需要手动调用save来保存它:
答案 9 :(得分:1)
尝试按照以下方式构建模式以获得最佳性能。此结构可帮助您避免重复数据,并在Laravel中执行代码验证以避免恶意输入。
CREATE TABLE IF NOT EXISTS `Users Table` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `Company Table` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`company name` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `company name` (`company name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `Users Company Table` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`userID` int(11) unsigned NOT NULL,
`companyID` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `userID` (`userID`),
KEY `companyID` (`companyID`),
CONSTRAINT `Users Company Table_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `Users Table` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `Users Company Table_ibfk_2` FOREIGN KEY (`companyID`) REFERENCES `Company Table` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
答案 10 :(得分:1)
我希望此代码可以帮助您。这是一个插入唯一数据的SQL代码
$scope.treedata =
[
{ "label" : "User", "id" : "role1", "children" : [
{ "label" : "subUser1", "id" : "role11", "children" : [] },
{ "label" : "subUser2", "id" : "role12", "children" : [
{ "label" : "subUser2-1", "id" : "role121", "children" : [
{ "label" : "subUser2-1-1", "id" : "role1211", "children" : [] },
{ "label" : "subUser2-1-2", "id" : "role1212", "children" : [] }
]}
]}
]},
{ "label" : "Admin", "id" : "role2", "children" : [] },
{ "label" : "Guest", "id" : "role3", "children" : [] }
];
答案 11 :(得分:0)
您应该允许用户选择公司,然后简单地在UsersCompany表中引用UserID
,CompanyID
表。因此,如果UserA插入StackOverFlow并且UserB也在您的数据库中插入StackOverFlow,那么您将始终拥有唯一的记录。它会像:
或者,如果您希望用户进入公司,请检查是否存在同一公司:
var checkcompany= "select * from Company Table where company name=company name"
比检查
if(checkcompany ! =null)
比插入记录或忽略它。