私は、特定の基準を満たすユーザー(主に、別のテーブルに格納されているメタデータ)の特定の値を持つフィールドsupplier_id
を持つユーザーのみを含めるように、検証を定義しようとしています。そのため、私はUpdateXRequest
クラスでこれをやった:結合を定義中の検証
public function rules()
{
$journey = $this->route()->parameter('journey');
return ['driver_id' => [
Rule::exists('users', 'id')
->where(function($query) use ($journey){
$query->join('users_meta', 'users.id', '=', 'users_meta.user_id')
->where('users_meta.key', 'supplier_id')
->where('users_meta.value', $journey->supplier_id);
})
]
];
}
しかし、私はColumn not found: 1054 Unknown column 'users_meta.key' in 'where clause' (SQL: select count(*) as aggregate from users where id = x and (users_meta.key = supplier_id and users_meta.value = y))
なエラーになっています。
どうすればこの問題を解決できますか?
CREATE TABLE IF NOT EXISTS `users` (
`id` int(10) unsigned NOT NULL,
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`role_id` int(10) unsigned NOT NULL
);
CREATE TABLE IF NOT EXISTS `users_meta` (
`id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`type` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'null',
`key` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`value` text COLLATE utf8_unicode_ci,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
);
ALTER TABLE `users`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `users_email_unique` (`email`);
ALTER TABLE `users`
MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT;
ALTER TABLE `users_meta`
ADD PRIMARY KEY (`id`),
ADD KEY `users_meta_user_id_index` (`user_id`),
ADD KEY `users_meta_key_index` (`key`);
ALTER TABLE `users_meta`
MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT;
INSERT INTO `users` (`id`, `email`, `password`, `created_at`, `updated_at`, `role_id`) VALUES (6898, '[email protected]', '', '2017-08-09 12:15:05', '2017-08-09 13:19:56', 4);
INSERT INTO `users_meta` (`id`, `user_id`, `type`, `key`, `value`, `created_at`, `updated_at`) VALUES (18, 6898, 'string', 'supplier_id', '6897', '2017-08-09 12:15:05', '2017-08-09 12:15:05');
:
私は自分のバリデータ要求パー
、here'reスキーマクエリデフォルト Laravelのロジックを使用して答えを探している、というよりも書いています
クエリはOPに存在しましたが、リクエストごとにSQLクエリが追加されましたクエリログから取ら生成されます
それについての詳細を考えるselect count(*) as aggregate from `users` where `id` = 7011 and (`users_meta`.`key` = supplier_id and `users_meta`.`value` = 6897)
それは働いていない理由、それはすべて完璧に理にかなって - 内部join
は、その上に任意の条件を持っていない(それはそれことをまだ奇妙ですクエリログには表示されません。おそらく、select
ではなくwhere
のテーブルを不必要に結合しないようにLaravelによって行われた最適化です。この時点で、内部where
sがusers
上で実行し、ないテーブルの上にjoin
からされている - とhttps://laravel.com/docs/5.4/queries#joinsあたり(高度なJOIN句)、彼らはそれが(DarkMukkeの答え@あたりに)動作するためにjoin
内である必要が
あなた 'drivers'テーブルがあまりにも' users'テーブルに参加すべきではないことで、少ないデータを結合してより速くそれを作ることができます'users_meta'のためにあなたのjoinで' users.id'を使う前に? –
@ChinLeung - 申し訳ありませんが、それはタイプミスでした。今日のコードを再訪しました。そこには 'users'があったはずです – eithed
あなたは両方のテーブルの構造を教えてくれますか? :) –