2016-12-07 26 views
0

私は次のように2つのテーブルを持っています:Laravel 5クエリの関係が動作しない

1)。マイアル

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

2)。 END_DATEが01​​有効期限が切れている 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のレコードを持っていますEND_DATEがNULLである1つの記録 END_DATEが01​​

私はそれは私はあなたが少なくとも一つのNULLまたは1ではないが、有効期限が切れ発見した場合の結果を照会することを意味したURLを期限切れになりますlaravel関係クエリを書きたい

を満了していない1つの記録私たちはリストされていませんすべての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」またはリンクテーブルではない期限切れのレコードは、それがそのすべてのリンクEND_DATEがどのように私は

+0

これに関するお問い合わせはありますか? – user3150060

+0

アイデアを持っている人なら誰でもSQLクエリを提供できますか? – user3150060

答えて

1

達成するためにあなたの助けに感謝し、これを行うために

を満了したため、私だけexample.com期限切れ与えることを仮定するものあなたは意図している私が理解として、INGの、あなたは例えば return $this->hasMany('active_links', 'myurls_id')->where('end_date', '>', Carbon::now())->orderBy('end_date', 'dsc');のための関係の中に必要なものは何でも発注適用することができます

//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'); 
    } 
}  

として行うことができます。

移行でデフォルトの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'を代わりに使うことができます。高度なフィルタリングについては、高度なwhere節を使用することができます。期限切れのドメインのみについては、Laravel Documentation - https://laravel.com/docs/5.3/eloquent-relationships#querying-relations – Donkarnash

+0

を参照してください。example.comが返されます。私はurとは思わない戻り値のみの例では、comは両方のドメインexample、com、test、comを返しています。ここで問題が発生している可能性があります。終了日が重複していたり​​、期限切れになっている可能性があります。 – user3150060

関連する問題