2017-08-02 9 views
0

私はlaravel 5.3を使用しています。私はPromotionを持っているDeviceDevice hasMany emailsに属している。誰も私に助言を与えることができます。このプロモーションを行っているデバイスに接続されているすべての電子メールをプロモーションクエリで取得するにはどうすればよいですか? ラーベル関係が深い

は、現在私が手クエリが

public function search($data) 
{ 
    $perPage = empty($data['perPage']) ? 10 : $data['perPage']; 
    $sortField = empty($data['sortField']) ? 'id' : $data['sortField']; 
    $keyword = empty($data['keyword']) ? null : $data['keyword']; 

    $promotions = Promotion::whereHas('email', function ($query) use ($keyword) { 
     if (! empty($keyword)) { 
      $query->where('email', 'like', "%{$keyword}%"); 
     } 
    }) 
    ->orWhere('promo_code', 'like', "%{$keyword}%") 
    ->with('devicesWithEmails') 
    ->orderBy($sortField) 
    ->paginate($perPage); 

    return $promotions->toArray(); 
} 

(推進中)のデバイスモデルのような

public function emails() 
{ 
    return $this->belongsToMany(Email::class, 'emails_devices'); 
} 

に見える

public function devicesWithEmails() 
{ 
    return $this->belongsTo(Device::class)->with('Emails'); 
} 

推進モデルでは、この

ような何かをしようとしていますメールモデル

public function devices() 
{ 
    return $this->belongsToMany(Device::class, 'emails_devices'); 
} 

推進モデル

public function device() 
{ 
    return $this->belongsTo(Device::class); 
} 

テーブル構造は残念ながらdevicesWithEmailsは常にnullを返し

CREATE TABLE `devices` (
     `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
     `created_at` TIMESTAMP NULL DEFAULT NULL, 
     `updated_at` TIMESTAMP NULL DEFAULT NULL, 
     `apptype` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
     `oid_id` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
     `lang` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
     `referrer` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
     `app_version` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
     `mobiledeviceid` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci', 
     `name` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci', 
     `is_paid` TINYINT(1) NULL DEFAULT NULL, 
     `status` TINYINT(1) NULL DEFAULT NULL, 
     `is_internal_user` TINYINT(1) NULL DEFAULT NULL, 
     `paid_date` DATE NULL DEFAULT NULL, 
     `paid_date_end` DATE NULL DEFAULT NULL, 
     PRIMARY KEY (`id`) 
    ) 
    COLLATE='utf8_unicode_ci' 
    ENGINE=InnoDB; 

CREATE TABLE `emails` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `created_at` TIMESTAMP NULL DEFAULT NULL, 
    `updated_at` TIMESTAMP NULL DEFAULT NULL, 
    `status` INT(11) NOT NULL DEFAULT '1', 
    `email` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci', 
    `client_type` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci', 
    PRIMARY KEY (`id`) 
) 
COLLATE='utf8_unicode_ci' 
ENGINE=InnoDB; 

CREATE TABLE `emails_devices` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `created_at` TIMESTAMP NULL DEFAULT NULL, 
    `updated_at` TIMESTAMP NULL DEFAULT NULL, 
    `email_id` INT(10) UNSIGNED NOT NULL, 
    `device_id` INT(10) UNSIGNED NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `emails_devices_email_id_foreign` (`email_id`), 
    INDEX `emails_devices_device_id_foreign` (`device_id`), 
    CONSTRAINT `emails_devices_device_id_foreign` FOREIGN KEY (`device_id`) REFERENCES `devices` (`id`) ON DELETE CASCADE, 
    CONSTRAINT `emails_devices_email_id_foreign` FOREIGN KEY (`email_id`) REFERENCES `emails` (`id`) ON DELETE CASCADE 
) 
COLLATE='utf8_unicode_ci' 
ENGINE=InnoDB; 

CREATE TABLE `promotions` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `created_at` TIMESTAMP NULL DEFAULT NULL, 
    `updated_at` TIMESTAMP NULL DEFAULT NULL, 
    `status` INT(11) NULL DEFAULT NULL, 
    `batch_name` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `promo_code` VARCHAR(255) NOT NULL COLLATE 'utf8_unicode_ci', 
    `validity` TIMESTAMP NULL DEFAULT NULL, 
    `date` TIMESTAMP NULL DEFAULT NULL, 
    `device_id` INT(10) UNSIGNED NULL DEFAULT NULL, 
    `email_id` INT(10) UNSIGNED NULL DEFAULT NULL, 
    `used_date` DATE NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `promotions_device_id_foreign` (`device_id`), 
    INDEX `promotions_email_id_foreign` (`email_id`), 
    INDEX `promo_code_index` (`promo_code`), 
    CONSTRAINT `promotions_device_id_foreign` FOREIGN KEY (`device_id`) REFERENCES `devices` (`id`) ON DELETE CASCADE, 
    CONSTRAINT `promotions_email_id_foreign` FOREIGN KEY (`email_id`) REFERENCES `emails` (`id`) ON DELETE CASCADE 
) 
COLLATE='utf8_unicode_ci' 
ENGINE=InnoDB; 

です。

+0

あなたがこれまでにしようとしなければならないのか? –

+0

お試しいただいたコードを追加してください。 –

+0

コード例で質問を更新しました。注目してくれてありがとう! – Tasty

答えて

0

見つかりシンプルなソリューション

だけ

public function search($data) 
    { 
     $perPage = empty($data['perPage']) ? 10 : $data['perPage']; 
     $sortField = empty($data['sortField']) ? 'id' : $data['sortField']; 
     $keyword = empty($data['keyword']) ? null : $data['keyword']; 

     $promotions = Promotion::whereHas('email', function ($query) use ($keyword) { 
      if (!empty($keyword)) { 
       $query->where('email', 'like', "%{$keyword}%"); 
      } 
     }) 
      ->orWhere('promo_code', 'like', "%{$keyword}%") 
      ->with('device.emails') 
      ->orderBy($sortField) 
      ->paginate($perPage); 

     return $promotions->toArray(); 
    } 
関連する問題