0

У меня есть 3 пользователя, статьи и метасты. Я определил morphTo() и morphToMany() в соответствии с документом laravel 5.3 doc, и я могу вытащить любое конкретное свойство пользователя или статьи, определенных в таблице метаданных, таких как имя или фамилия или координата.Поиск данных метаданных laravel типа metable

Теперь у меня возникают трудности с написанием правильной модели для поиска этих свойств, например, для поиска имени или фамилии любого пользователя или обоих.

<u>User table</u> 
id. username. password 
1.  Test.    Testpass 

<u>article</> 
id. Title.      Slug 
1.  My article title. my-article-title 

Metas стол

Id.  key.    value.     metable_id metable_type 
1  firstname  Ade      1      App\User 
2.  content.  Sample article 1.      App\Article 
3.  lastname.  Keon.     1.     App\User 

Meta.php экстракт

public function metable() { 
    return $this->morphTo(); 
} 

User.php Экстракт

public function meta() { 
    return $this->morphToMany('App\User', 'metable'); 
} 

public function getName() { 
    $user = User::find($this->id); 
    $metadata = $user->meta()->whereIn('key', ['firstname', 'lastname']) ; 
    dd($metadata); 
} 

article.php

public function meta() { 
    return $this->morphToMany('App\User', 'metable'); 
} 

Функция GetName работала как ожидался, но я не могу понять, как сделать поиск метаданных пользователя в отличии от обычных PHP/таблиц тузды присоединяется

Dont знает, как в целом полиморфные отношения в Laravel является ново для меня, но я нашел и использовал что-то вроде этих:

public function getSearch() { 
     return User::with(array('metas' => function($query) { 
      $query->where('value', $query); 
     })); 
} 

или

public function getSearch() { 
     return User::with('metas') 
     ->whereHas('metas', function($query) { 
       $query->where('value', '=', $query); 
      }); 
    } 

Я не могу видеть, или причина, как дзёи п таблица в Laravel

вот мой новый поисковый запрос

public function getResults(Request $request) { 
    $keyword = $request->input('query'); 
    $filterOne = $request->input('minAge'); 
    $filterTwo = $request->input('maxAge'); 

    $query = User::with(['meta' => function ($q) { 
     $q->where('value', 'like', $keyword) 
      ->orWhere(function ($q) { 
       $q->whereBetween('value', [$filterOne,$filtertwo]); 
      }); 
    }])->get(); 

dd($query); 
} 
+0

Опишите, что вы попробовали и что не работает. – TheFallen

+0

Показать схему базы данных и ваши отношения. –

+0

@ TheFallen Я обновил d вопрос, как советовал – adeguk

ответ

0

Благодарность за выше вклад, недостаточное это на самом деле толкать меня труднее чтение и мышление, я, наконец, наткнулся на use() с функцией запросом как показано ниже;

public function getResults(Request $request) { 
     $keyword = $request->input('query'); 
     $filterOne = $request->input('minAge'); 
     $filterTwo = $request->input('maxAge'); 

     if (isset($keyword)) { 
      $query = User::with(['meta' => function ($q) use ($keyword,$filterOne,$filterTwo) { 
       $q->where('value', 'LIKE', $keyword) 
        ->whereBetween('value', [$filterOne, $filterTwo]); 
      }])->get(); 
     } else { 
      $query = User::with(['meta' => function ($q) use ($filterOne,$filterTwo) { 
       $q->whereBetween('value', [$filterOne, $filterTwo]); 
      }])->get(); 
     } 

     dd($query); 
    } 

Это дает мне результат, который я ищу; хотя я не уверен, что это влияет на производительность при работе с большим набором данных, но потом я думаю, что это мое следующее задание.