2016-03-02 59 views
0

我想包含一个dynamicaly创建的锚链接到显示该公司所有用户的搜索页面。用户被允许隶属于多家公司。该信息被从MySQL数据库的例子拉:在laravel中使用动态创建的锚href搜索

李四隶属于:

  • 百事公司
  • 冷饮INC。公司
  • 运动饮料公司

李四隶属于:

<a href="search/useraffiliation1"> Pespi Company</a> 
<a href="search/useraffiliation2"> Cold Drinks Inc Company</a> 
<a href="search/useraffiliation3"> Sports Drinks Company</a> 

1.什么是最好的方式去做这件事。

2.什么是构建我的数据库的最佳方式。我应该为每个联盟使用单个列还是将所有联盟归入一个联盟。

+1

I'd使用3个表(用户,x_user_affiliations,公司) –

+1

还我会电子书籍,你认为一个链接结构,如: 'search/user/{user_id}/affiliations',也许'search/affiliation/{affiliation_id}' –

+0

非常感谢你,让我省去了很多头痛!我了解三表格结构,但请您详细解释结构。非常感谢!例如,你将如何为每个用户,用户从属关系和从属关系构建表格! – Luna

回答

1

编辑:我只是意识到我是回应评论,并没有真正回答你原来的问题,所以我更新了我的例子下面。

如果您完全使用Laravel和工匠来构建数据库并跟踪迁移,那么您需要为3表做什么。您希望affiliations表保存用户的id和公司的id。

首先,在命令行中创建3个数据库迁移:

php artisan make:migration create_users_table --table="users" 
php artisan make:migration create_companies_table --table="companies" 
php artisan make:migration create_affiliations_table --table="affiliations" 

现在你将有你的/数据库/文件夹迁移迁移3个档。

的文件将是这样的:

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateTableUsers extends Migration 
{ 
    public function up() 
    { 
     Schema::create('users', function (Blueprint $table) { 
      $table->increments('id')->unsigned(); 
      $table->string('email')->unique(); 
      $table->string('password', 60); 
      //more fields @see https://laravel.com/docs/master/migrations#creating-columns 
      $table->rememberToken(); 
      $table->timestamps(); 
      $table->softDeletes(); 
     }); 
    } 

    public function down() 
    { 
     Schema::drop('users'); 
    } 
} 

-

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateTableCompanies extends Migration 
{ 
    public function up() 
    { 
     Schema::create('companies', function (Blueprint $table) { 
      $table->increments('id')->unsigned(); 
      $table->string('name', 100); 
      //more fields @see https://laravel.com/docs/master/migrations#creating-columns 
      $table->timestamps(); 
      $table->softDeletes(); 
     }); 
    } 

    public function down() 
    { 
     Schema::drop('companies'); 
    } 
} 

-

<?php 

use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateTableAffiliations extends Migration 
{ 
    public function up() 
    { 
     Schema::create('affiliations', function (Blueprint $table) { 
      $table->integer('user_id')->unsigned(); 
      $table->integer('company_id')->unsigned(); 
      $table->primary(['user_id', 'company_id']); 
     }); 
    } 

    public function down() 
    { 
     Schema::drop('affiliations'); 
    } 
} 

现在运行人员更多的时间在您的控制台来创建表。

php artisan migrate 

当您查询数据库时,您有几个选项。例如,一个原始的SQL查询可能类似于:

SELECT c.* FROM affiliations a JOIN companies c ON (a.company_id=c.id) WHERE a.user_id=1; 

SELECT u.* FROM affiliations a JOIN users u ON (a.user_id=u.id) WHERE a.company_id=1; 

但是,它可能会更好,因为你正在使用Laravel用雄辩的车型。我喜欢在我的App/Db文件夹中创建Db模型。例如,这就是/App/Db/Companies.php的样子。

<?php 

namespace App\Db; 

use Illuminate\Database\Eloquent\Model; 
use Illuminate\Database\Eloquent\SoftDeletes; 

class Companies extends Model { 

    use SoftDeletes; 

    public function affiliations() { 
     return $this->hasMany('App\Db\Affiliations', 'company_id', 'id'); 
    } 
} 

这只是一个例子,没有测试过。

参考https://laravel.com/docs/master/eloquent-relationships#defining-relationships

你会让你的其他数据库的表款(兼职&用户)过了,在你的应用程序,查询可能是这样的:

class CompanyController extends Controller { 

    public function search($id) { 
     $company = Companies::find($id); 
     $company->load('affiliations.users'); 

     foreach ($company->affiliation as $aff) { 
      echo $aff->user->name; 
     }  
    } 
} 

你可以切换,围绕您也可以找到与该公司ID具有联属关系的用户。关于查询关系的更多信息:https://laravel.com/docs/master/eloquent-relationships#querying-relations

有几种方法可以实现您想要的结果,所以真正了解这些雄辩的关系!对于如此简单的事情来说,这似乎有很多工作要做,但是当您构建更大的应用程序时,它非常方便。

有关您原来的问题,这样做的路由看起来是这样:

Route::get('/search/company/{id}', '[email protected]'); 
+0

好东西,谢谢100万! – Luna