簡體   English   中英

使用laravel中動態創建的anchor href搜索

[英]Search using dynamically created anchor href in laravel

我想包含一個動態創建的錨點,該錨點鏈接到顯示該公司所有用戶的搜索頁面。 允許用戶隸屬於多家公司。 該信息是從mysql數據庫示例中提取的:

John Doe隸屬於:

  • 百事可樂公司
  • 冷飲公司
  • 運動飲料公司

John Doe隸屬於:

<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.什么是構建數據庫的最佳方法? 我應該為每個從屬關系使用一個單獨的列還是將所有從屬關系合並為一個。

編輯:我只是意識到我正在回應評論,並沒有真正回答您的原始問題,因此我在下面更新了示例。

如果您完全使用Laravel和artisan來構建數據庫並跟蹤遷移,那么這是對3個表要做的。 您希望從屬關系表包含用戶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"

現在,/ database / migrations文件夾中將包含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');
    }
}

現在,在控制台中再次運行artisan,以創建表。

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

您還將創建其他Db表模型(從屬關系和用戶),並且在您的應用程序中,查詢可能如下所示:

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}', 'CompanyController@search');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM