Merge laravel 4 multiple relashionships - php

I have two relashionships in laravel v4.2. When I merge these two relashion into third function and then I call third function then I receive Uncought exception. Below is my code
public function following_friend() {
return $this->hasOne('Friend', 'following_id', 'id');
}
public function follower_friend() {
return $this->hasOne('Friend', 'follower_id', 'id');
}
public function mutual_friends() {
return $this->following_friend->merge($this->follower_friend);
}
public static function get_users_infomation_by_ids($login_id, $users_arr = array()) {
$users = User::where(function($sql) use($login_id, $users_arr) {
$sql->whereIn('id', $users_arr);
})
->with('mutual_friends')
->get(array('id', 'username', 'full_name', 'is_live', 'message_privacy', 'picture'));
return (!empty($users) && count($users) > 0) ? $users->toArray() : array();
}
I don't know that where is the problem in merging these two relashionships.

Try to write like below :-
public static function get_users_infomation_by_ids($login_id, $users_arr = array()) {
$users = User::with('mutual_friends')
->where(function($sql) use($login_id, $users_arr) {
$sql->whereIn('id', $users_arr);
})
->get(array('id', 'username', 'full_name', 'is_live', 'message_privacy', 'picture'));
return (!empty($users) && count($users) > 0) ? $users->toArray() : array();
}
Since I have used like this for one of my Project :-
public function getShipmentDetails($shipmentId = null) {
$response = Shipment::with('pdDetails','shipmentDocuments')
->where('id', $shipmentId)
->first();
if($response) {
return $response->toArray();
}
}
It works for me.

Related

Laravel output model ordered by related table column

I have this query filter which works fine to query out the result. For example, if I need to find books which have the Author name something:
Book::with('user', 'author')
->whereHas('author', function ($query) use($filters) {
$query->filter($filters);
})->paginate(30);
But the thing is if I want to order the Books by the author names. I this case nothing happens.
How can I sort books by author name?
QueryFilter looks like this:
public function __construct(Request $request) {
$this->request = $request;
$this->filterService = new FilterService();
}
public function apply(Builder $builder) {
$this->builder = $builder;
foreach ($this->filters() as $name => $value) {
if (method_exists($this, $name)) {
call_user_func_array([$this, $name], array_filter([$value]));
}
}
return $this->builder;
}
public function filters() {
return $this->filterService->removeEmptyFieldsFromRequest($this->request);
}
And the book filter looks like this:
public function date($date) {
return $this->builder->where('date', $date);
}
public function name_sort($order = 'asc') {
return $this->builder->orderBy('name', $order);
}
You can use class join statement :
$books = Book::select('author.name AS author_name, countries.*')
->with('user')
->join('author', 'author.id', '=', 'book.author_id')
->orderBy('author.name', 'ASC')
->paginate(10);

Laravel how to use if stament in controller

I have 2 functions(index and dateRange) .
In index.blade.php I want to use if statement to choose which function it will run.
But when I type :
index{ if($request['from'] != null ) { //run this}
but this time the indexController not runs
request()->ajax() this if statement }..
How can i handle it?
Here is my whole function:
public function index(Request $request)
{
if (!Gate::allows('follow_access')) {
return abort(401);
}
if (request()->ajax()) {
$query = Follow::query()->where('qr_approved', 1)->where('qr_non_approved', 0);
$query->with("competitor_product");
$query->with("product");
$query->with("user");
$template = 'actionsTemplate';
if ($request['From'] != null || $request['To'] != null) {
dd("try me");
}
if (request()->ajax()) {
// NOT WORK
}
}
}
Here updated below code
public function index(Request $request)
{
if (!Gate::allows('follow_access')) {
return abort(401);
}
if ($request->ajax()) {
$query = Follow::query()->where('qr_approved', 1)->where('qr_non_approved', 0);
$query->with("competitor_product");
$query->with("product");
$query->with("user");
$template = 'actionsTemplate';
if ($request['From'] != null || $request['To'] != null) {
dd("try me");
}
if ($request->ajax()) {
// NOT WORK
}
}
}

Pass id from public function to other public function

I got a public function call header:
public function header() {
$link = Link::with('page', 'tag')->orderBy('clicks', 'desc')->first();
$link_id = $link->id;
return view('site.templates.linksheader', compact('link'));
}
And I got a public function call index2:
public function index2() {
$links = Link::where('status', '=', 1)
->orderBy('clicks', 'desc')
->with('page', 'tag')
//->whereNotIn('id', $id);
->take(12)
->get();
}
In the ->whereNotIn of index2, I want to get the $id of function header()...
You can do
public function header() {
$link = $this->getFirstLink();
return view('site.templates.linksheader', compact('link'));
}
And
public function index2() {
$links = Link::where('status', '=', 1)
->orderBy('clicks', 'desc')
->with('page', 'tag')
->whereNotIn('id', $this->getFirstLink()->id);
->take(12)
->get();
}
And
private function getFirstLink() {
return Link::with('page', 'tag')->orderBy('clicks', 'desc')->first();
}

Laravel filters system with multi checkbox

I am using laravel 5.4 and I want to filter search. its my front-end
my code looks like this
class DeviceFilterController extends Controller
{
public function filter(Feature $feature){
$marks = isset($_POST["mark"]) ? $_POST["mark"] : null;
$feature = $feature->newQuery();
if(isset($marks ))
{
foreach ($marks as $value)
{
$feature->where('device_mark', $value);
}
}
return $feature->get();
}
}
that result just one entry
You could take a different approach using whereIn(), assuming you mark input is an array of IDs like [1, 4, 8, 22].
public function filter(Request $request)
{
$features = Feature::when($request->has('mark'), function($query) use ($request) {
return $query->whereIn('device_mark', $request->mark); //Assuming you are passing an array of IDs
})->get();
return $features;
}
when() closure will only executes when you are sending 'mark' input. Doing it without when would look like this
public function filter(Request $request)
{
$features = [];
if ( $request->has('mark') && $request->mark != '' ) {
$features = Feature::whereIn('device_mark', $request->mark)->get();
} else {
$features = Feature::get();
}
return $features;
}

In Laravel how can I replace a controller/method/id with just /slug in the URL?

What is the best way I could replace /controller/method/id in the URL with just /slug?
For example: trips/1 would become /honduras-trip
This is what I am doing but couldn't their be a better way?
My routes:
Route::get('/{slug}', 'HomeController#show');
My Controller:
public function show($slug)
{
$class = Slug::where('name', '=', $slug)->firstOrFail();
if($class->slugable_type == 'Trip')
{
$trip = Trip::find($class->slugable_id);
return $trip;
}
if($class->slugable_type == 'Project')
{
$project = Project::find($class->slugable_id);
return $project;
}
if($class->slugable_type == 'User')
{
$user = User::find($class->slugable_id);
return $user;
}
}
My Slug Model:
class Slug extends Eloquent {
public function slugable()
{
return $this->morphTo();
}
}
The other models all have this method:
public function slugs()
{
return $this->morphMany('Slug', 'slugable');
}
In your routes.php just give
Route::get('slug', array('uses' => 'HomeController#show'));
In your controller, write show() function
public function show() {
return View::make('welcome');
}
In your view give,
<li>slug</li>

Categories