2016-12-07 9 views
0

У меня есть две таблицы:Laravel 5 Запрос не работает

1). myurls

id domain  
---------------------- 
    1  google.com 
    2  test.com 
    3  example.com etc 

2). Ссылки

 id myurls_id end_date    created_at 
--------------------------------------------------- 
    1  2  2016-11-30 00:00:00 2016-11-30 00:00:00 
    2  2  2016-12-01 00:00:00 2016-11-30 00:00:00 
    3  2  NULL     2016-11-30 00:00:00 
    4  2  2017-01-01 00:00:00 2016-12-01 00:00:00 
    5  3  2016-11-24 00:00:00 2016-12-01 00:00:00 
    6  3  2016-10-01 00:00:00 2016-12-01 00:00:00 

и т.д ... они имеют один ко многим отношений с myurls_id, как вы можете увидеть

в этом примере для myurls_id (2) мы имеем 4 записи: 2 записи, где end_date истек 1 запись, где end_date является NULL 1 запись, где end_date не истек

Я хочу написать запрос Laravel отношения, где он получит меня истек URL, что означает запрос результаты, где, если вы найдете по крайней мере один NULL или один не истек не указан мы o nly хотите перечислить, если все 4 записи истекли. как я могу это сделать

вот что у меня есть, но ее не работает:

$expired_domains = Myurls::with(['links' => function ($query) { 
     $query->whereNotNull('end_date') 
       ->where('end_date','<',Carbon::now()) 
       ->where('created_at', '<', Carbon::now()) 
       ->orderBy('created_at', 'asc') 
       ->first(); 

}])->get(); 

это показывает мне, что test.com & example.com оба EXPIRED что неправильно, но его не потому, что есть по меньшей мере, один end_date «NULL» или не истек запись в таблице ссылок, то предположим, только дайте мне example.com Истекло, потому что все его связь end_date истек

Как это сделать, я ценю вашу помощь

+0

любая помощь? – user3150060

+0

Любой, у кого есть идеи, может предоставить мне sql-запрос? – user3150060

ответ

1

чтобы добиться того, что вы намерены ING, как я понимаю, может быть сделано как

//In your MyUrls model define two relationships 
<?php 

namespace App\Models; 

use Carbon\Carbon; 
use Illuminate\Database\Eloquent\Model; 

class MyUrls extends Model 
{ 
    protected $table="myurls"; 

    protected $fillable = ['domain']; 

    public function links() 
    { 
     return $this->hasMany(Link::class, 'myurls_id'); 
    } 

    public function active_links() 
    { 
     return $this->hasMany(Link::class, 'myurls_id') 
        ->whereApproved(1) 
        ->where('end_date', '>', Carbon::now()); 
    } 

    public function null_links() 
    { 
     return $this->hasMany(Link::class, 'myurls_id') 
        ->whereApproved(1) 
        ->whereNull('end_date'); 
    } 

    public function unapproved_active_links() 
    { 
     return $this->hasMany(Link::class, 'myurls_id') 
        ->whereApproved(0) 
        ->where('end_date', '>', Carbon::now()); 
    } 

    public function unapproved_null_links() 
    { 
     return $this->hasMany(Link::class, 'myurls_id') 
        ->whereApproved(0) 
        ->whereNull('end_date'); 
    } 
}  

Вы можете применить любой заказ вам нужно в отношениях, например, для return $this->hasMany('active_links', 'myurls_id')->where('end_date', '>', Carbon::now())->orderBy('end_date', 'dsc');.

Если вы используете по умолчанию timestamps() в своих миграциях, вам, вероятно, не нужно будет проверять where('created_at', '<', Carbon::now());.

Затем в контроллере (или где-либо еще), вы можете получить данные домены, как

$allDomains = MyUrls::all(); //list of all domains 

//All domains which have links but do not have active_links are expired. 
//Domains without any links will not be listed here. 
$expiredDomains = MyUrls::has('links') 
         ->doesntHave('active_links') 
         ->doesntHave('null_links') 
         ->doesntHave('unapproved_active_links') 
         ->doesntHave('unapproved_null_links') 
         ->get(); 

//All domains which have active_links are active. 
//Domains without any links will not be listed here. 
$activeDomains = MyUrls::has('active_links')->get(); 

Затем на ваш взгляд, вы можете использовать

<h4>All Domains</h4> 
    <ul> 
     @foreach($allDomains as $domain) 
      <li>{{$domain->domain}}</li> 
     @endforeach 
    </ul> 
    <hr /> 
    <h4>Expired Domains</h4> 
    <ul> 
     @foreach($expiredDomains as $domain) 
      <li>{{$domain->domain .' is an expired domain '}}</li> 
     @endforeach 
    </ul> 
    <hr /> 
    <h4>Active Domains</h4> 
    <ul> 
     @foreach($activeDomains as $domain) 
      <li>{{$domain->domain .' has an end date of '.$domain->active_links[0]->end_date}}</li> 
     @endforeach 
    </ul> 

Надежда это то, что вы намерены и его помогает вам начать работу.

+0

Я получаю сообщение об ошибке в этой строке MyUrls :: whereHas ('links') говорит, что исключает 2 параметра ?? – user3150060

+0

Я отредактировал ответ, в этом случае, поскольку мы не фильтруем результаты 'whereHas' и' whereDoesntHave', мы можем просто использовать 'has' и' doesntHave' вместо этого. Для расширенной фильтрации мы можем использовать расширенные предложения, ссылающиеся на Laravel Documentation - https://laravel.com/docs/5.3/eloquent-relationships#querying-relations – Donkarnash

+0

для истекшего домена, только он вернет example.com. Я не думаю, что ур пример с примером только для возврата, com возвращает оба примера домена, com и test ,, com bc проблема здесь может быть повторяющейся датой окончания, которая имеет Null или не истекает – user3150060

Смежные вопросы