Я хочу включить динамически созданный якорь, который ссылается на страницу поиска, которая отображает всех пользователей этой компании. Пользователи могут быть связаны с более чем одной компанией. Информация извлекается из примера базы данных mysql:
Джон Доу связан с:
Джон Доу связан с:
<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 стола. Вы хотите, чтобы таблица присоединений содержала идентификатор пользователя и идентификатор компании.
Сначала создайте 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 файла миграции в папке / database / migrations.
Файлы будут выглядеть так:
<?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. Мне нравится создавать модели Db в моей папке App / 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 таблицы (Affiliations & Пользователи), и в вашем приложении запрос может выглядеть так:
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;
}
}
}
Вы также можете изменить это, когда найдете пользователей, имеющих отношение к идентификатору этой компании. Подробнее о запросе отношений: https://laravel.com/docs/master/eloquent-relationships#querying-relations
Есть несколько способов достичь желаемого результата, так что действительно читайте об этих красноречивых отношениях! Кажется, много работы для чего-то такого простого, но когда вы создаете большие приложения, это очень удобно.
Относительно вашего исходного вопроса, маршрут для этого может выглядеть так:
Route::get('/search/company/{id}', 'CompanyController@search');
Других решений пока нет …