如何避免用户

时间:2016-03-22 23:09:30

标签: php mysql laravel

我正在创建一个网站,让用户可以列出最多5家与之关联的公司。当其他用户搜索这些公司时,与该公司关联的所有用户都将显示在搜索结果中。

公司将由用户通过文本输入字段提交。

如何避免用户提交重复的公司?例如。如果UserA提交了一个名为stackoverflow的公司,那么UserB就会提交stackoverflow,我的数据库中会有2个stackoverflow。

我有3张桌子:

用户表

ID |用户名|电子邮件

公司表

id |公司名称

UsersCompany表

ID |用户ID | companyID

我正在使用Laravel 5

12 个答案:

答案 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,COM​​MENT_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来保存它:

as stated here

答案 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表中引用UserIDCompanyID表。因此,如果UserA插入StackOverFlow并且UserB也在您的数据库中插入StackOverFlow,那么您将始终拥有唯一的记录。它会像:

  • 1-UserA-StackOverflow
  • 2-用户B-计算器。

或者,如果您希望用户进入公司,请检查是否存在同一公司:

var checkcompany= "select * from Company Table where company name=company name"

比检查

if(checkcompany ! =null)

比插入记录或忽略它。